java - DES3、triple_des加密的问题
本文介绍了java - DES3、triple_des加密的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
我要用python对接一个java的接口,然而对方是用java的3des加密的方法
我试过好几种方法,都没达到符合要求的加密方式。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);
}
解决方案
看来你是误解了这一句:
不足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字节
这篇关于java - DES3、triple_des加密的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文