DES3、triple_des加密的问题

我要用python对接一个java的接口,然而对方是用java的3des加密的方法

clipboard.png
我试过好几种方法,都没达到符合要求的加密方式。python的pycrypto中的DES3或者pyDes的triple_des都没有PKCS7这种加密方式。
有人做过这些吗?求指点。
附上我的代码,运算出来的并不正确。

from pyDes import *
import pyDes
def toHex(txt):
    return ''.join(["%02x" % x for x in txt]).strip()
data = "1234567890123456789"
k = triple_des(b"test12345678901234000000", ECB, pad=None, padmode=PAD_PKCS5)
d = k.encrypt(data)
print ("Encrypted: %r" % d)
print(toHex(d))

下面是java的关键部分代码,我不太明白DESede在加密中的作用

private static byte[] des3Encryption(byte[] key, byte[] data) throws 
        NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException,
        BadPaddingException, IllegalBlockSizeException, IllegalStateException {
        
        final String Algorithm = "DESede";
        if(key.length != 24){
            throw new RuntimeException("Invalid DESede key length (must be 24 bytes)");
        }
        SecretKey deskey = new SecretKeySpec(key, Algorithm);
        
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.ENCRYPT_MODE, deskey);
        return c1.doFinal(data);
    }
阅读 5k
1 个回答

看来你是误解了这一句:

不足24位在后边补0

这个0指的是ASCII码值0 ,'\0'
改动后:

from pyDes import *
import pyDes
def toHex(txt):
    return ''.join(["%02x" % x for x in txt]).strip()

def do_3des():
  data = "1234567890123456789"
  k = triple_des(b"test12345678901234\0\0\0\0\0\0", ECB, pad=None, padmode=PAD_PKCS5)
  d = k.encrypt(data)
  print ("Encrypted: %r" % d)
  print(toHex(d))

do_3des()

输出:

Encrypted: b'<E\xaa\xc4K\x04f\x0f\xe6\x88\xea\xd9Y\xd6\xedH#/\xa2mO\x83o@'
3c45aac44b04660fe688ead959d6ed48232fa26d4f836f40

另外: PKCS#5 可以说是 PKCS#7的一个子集。 前者是针对8字节块padding,后者把padding的块大小放宽到255字节

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题