我在理解java和python的三重Des算法之间的概念时遇到了问题。在java中,加密的密钥是48个字符,而在python情况下不能应用相同的密钥。我尝试了上述两种建议-- here,但这两种方法似乎都不起作用。我无法在python中解密用java加密的字符串。java中的代码如下所示:
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
public class SecretKeyEncryptionExample
{
private static final String FORMAT = "ISO-8859-1";
public static final String DESEDE_ENCRYPTION_SCHEME = "DESede";
private KeySpec ks;
private SecretKeyFactory skf;
private Cipher cipher;
SecretKey key;
public SecretKeyEncryptionExample()
throws Exception
{
String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(myEncryptionKey.getBytes("ISO-8859-1"));
this.skf = SecretKeyFactory.getInstance("DESede");
this.cipher = Cipher.getInstance("DESede");
this.key = this.skf.generateSecret(this.ks);
}
而在python中,如果我使用:
from pyDes import *
import hashlib
import base64
key1 = "<48 chars long key>".decode('hex')
data = "<Some encrypted strings>"
k = triple_des(key1, ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
e = k.decrypt(data)
print e
我按照给here的第一个建议做了这件事,但是它什么也没有打印出来。我再次尝试了来自同一页的第二个建议,该建议要求使用前24个字符作为键,而忽略rest:
from pyDes import *
import hashlib
import base64
key1 = "<taking only first 24 chars long key>"
data = "<Some encrypted data>"
k = triple_des(key1, ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
e = k.decrypt(data)
print e
但这也让我没有输出。我对所有这些研究感到困惑。请建议哪条路是正确的,以及为什么我没有从这两种方法中得到任何输出。谢谢..
发布于 2014-02-24 16:57:33
据我所知,在您的Python脚本中,您正在进行十六进制解码。但是,在Java代码中,您将字符串本身转换为字节。
试一试如下:
String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
此外,确保您充分指定您的密码算法,以避免可移植性问题。因此,替换:
Cipher.getInstance("DESede");
有这样的东西:
Cipher.getInstance("DESede/ECB/PKCS5Padding");
发布于 2018-08-28 02:53:39
Oracle具有默认的PKCS5填充。据报道,这对于Android甚至其他JDK来说是不同的。
(此外,Java为超过24个字符的任何内容设置键。它不会引发类似于pydes的异常)
据我所知,欧洲央行模式下的Java实现没有默认的IV。
但是,如果您要从Java到Python做一个直接端口,这可能只会做到这一点:
triple_des(key1, ECB, pad=None, pad_mode=PAD_PKCS5)
https://stackoverflow.com/questions/21982389
复制相似问题