【问题标题】:Question about DES encryption in python关于python中DES加密的问题
【发布时间】:2011-10-14 20:46:23
【问题描述】:

我正在尝试创建一个 LM/NTLM 响应,为此我需要使用 DES 算法加密服务器发送的质询

以下是我所做的:

from M2Crypto.EVP import Cipher

def encryptChallenge(magic, key):  
    str_key = ""  
    for iter1 in key:  
        str_key = str_key + chr(iter1)  

    encrypt = 1
    cipher = Cipher(alg='des_ede_ecb', key=str_key, op=encrypt, iv='\0'*16)
    ciphertext = cipher.update(magic)
    ciphertext += cipher.final()

    return ciphertext

但是,当我尝试使用 DES 加密 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" 时,我得到以下结果:

用于加密的密钥:['0xfe', '0x9b', '0xd5', '0x16', '0xcd', '0x15', '0xc8', '0x49']

加密后的挑战:

 Encrypted_server_challenge_using_key_1 : ['0x66', '0xf7', '0xa', '0xf8', '0xda', '0x4e', '0x7', '0xaa', '0x65', '0xc3', '0x8d', '0xaa', '0x48', '0xcc', '0x67', '0x57', '0xe2', '0xb0', '0x6e', '0x10', '0xb', '0x5e', '0xdd', '0xb4']

服务器不接受上述响应

用一个叫DEScalc.jar的工具(http://www.unsw.adfa.edu.au/~lpb/src/DEScalc/index.html)试过了,发现加密后的结果是:

setKey(fe9bd516cd15c849)
encryptDES(0123456789abcdef)
  IP:   L0=cc00ccff, R0=f0aaf0aa
  Rnd1  f(R0=f0aaf0aa, SK1=0b 2c 23 12 33 1c 2b 09 ) = 988995a0
  Rnd2  f(R1=5489595f, SK2=21 15 0d 11 1c 1a 3b 38 ) = 63200664
  Rnd3  f(R2=938af6ce, SK3=01 35 2f 05 3e 19 30 1f ) = c206c318
  Rnd4  f(R3=968f9a47, SK4=06 37 07 01 03 37 1a 3e ) = bdf738ef
  Rnd5  f(R4=2e7dce21, SK5=06 14 17 29 0f 17 27 25 ) = 76c68d3d
  Rnd6  f(R5=e049177a, SK6=34 14 06 0d 28 2c 23 37 ) = c182a1c7
  Rnd7  f(R6=efff6fe6, SK7=04 18 2e 05 31 3a 3e 17 ) = c3e45497
  Rnd8  f(R7=23ad43ed, SK8=04 13 22 27 2f 30 1f 19 ) = 4977a92c
  Rnd9  f(R8=a688c6ca, SK9=12 0a 38 0c 3d 33 19 26 ) = 4975507e
  Rnd10 f(R9=6ad81393, SK10=10 0b 30 1e 1f 08 2f 2e ) = d52a9361
  Rnd11 f(R10=73a255ab, SK11=19 0a 31 22 05 0f 33 1f ) = 38b2a619
  Rnd12 f(R11=526ab58a, SK12=38 2e 30 22 1b 3b 13 31 ) = e9dec064
  Rnd13 f(R12=9a7c95cf, SK13=3a 0a 1c 12 2a 3e 35 2b ) = d88ee399
  Rnd14 f(R13=8ae45613, SK14=19 09 18 1b 0b 2d 3c 16 ) = 9de6ddb2
  Rnd15 f(R14=079a487d, SK15=19 39 01 12 37 14 17 36 ) = 5fb60a90
  Rnd16 f(R15=d5525c83, SK16=24 05 0d 39 31 1f 2d 34 ) = 6a40b6ea
  FP:   L=c337cd5c, R=bd44fc97
 returns c337cd5cbd44fc97

注意到上面的结果被服务器接受了

DEScalc.jar 是否使用了我缺少的特定算法,因此我没有得到 DEScalc.jar 获得的结果


大家好, 非常感谢你的帮助;问题在于我在 python 中表示十六进制的方式;我使用以下函数将“0123456789abcdef”转换为 Keith 提到的十六进制表示,并且它有效:

def HexToByte( hexStr ):
    """
    Convert a string hex byte values into a byte string. The Hex Byte values may
    or may not be space separated.
    """
    # The list comprehension implementation is fractionally slower in this case    
    #
    #    hexStr = ''.join( hexStr.split(" ") )
    #    return ''.join( ["%c" % chr( int ( hexStr[i:i+2],16 ) ) \
    #                                   for i in range(0, len( hexStr ), 2) ] )

    bytes = []

    hexStr = ''.join( hexStr.split(" ") )

    for i in range(0, len(hexStr), 2):
        bytes.append( chr( int (hexStr[i:i+2], 16 ) ) )

    return ''.join( bytes )

非常感谢

【问题讨论】:

  • 出于好奇,您是否也将密码从 DES-EDE-ECB 更改为 DES-ECB?

标签: python des


【解决方案1】:

这里的问题在于您的源(明文)字符串。您将每个字符扩展为两个字节,而不是一个字节。 Java 程序将接受输入“0123456789abcdef”,并在内部使用它的十六进制字符串。使用 pycrypto 和正确编码的明文我得到了这个。

Python2> from Crypto.Cipher import DES
Python2> key
'\xfe\x9b\xd5\x16\xcd\x15\xc8I'
Python2> pw
'\x01#Eg\x89\xab\xcd\xef'
Python2> eng = DES.new(key, DES.MODE_ECB, "\0"*8)
Python2> hexdigest(eng.encrypt(pw))
'c337cd5cbd44fc97'

你看到的和Java代码一样。

【讨论】:

  • 哇,太棒了;非常感谢您帮助基思;你是如何生成 pw 字符串的?
  • 啊,漂亮,我刚刚在:code.activestate.com/recipes/…
  • 该链接中的 HexToByte 函数有效非常感谢 Keith
  • NP。我使用了自己的 unhexdigest 函数,与链接的函数非常相似。 :-) PS。由于您是新来的,您可以“接受”答案。 ;-)
【解决方案2】:

您确定需要使用 DES-EDE-ECB 吗?

EDE 意味着您实际上在使用三重 DES:您运行 DES 三次(使用三个不同的密钥),而 EDE 意味着您加密-解密-加密(每次使用不同的密钥)。

但听起来你应该只使用普通的 DES ('des_ecb')。

【讨论】:

  • 感谢 omrib 这次会尝试使用 des_ecb 看看我是否得到了正确的结果
  • 试过des_ecb,结果还是不一样:
  • 对不起,在评论部分按回车实际上是提交,所以错过了这个文本:Encrypted_server_challenge_using_key_1 : ['0x25', '0x84', '0x4c', '0x45', '0x86', '0xce', '0x7'、'0xf9'、'0xd6'、'0x83'、'0x49'、'0xab'、'0x3b'、'0x83'、'0xf2'、'0xe6']
猜你喜欢
  • 2021-10-11
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
相关资源
最近更新 更多