Java中的DESede和python中的3des

Java中的DESede和python中的3des,java,python,encryption,Java,Python,Encryption,我在理解java的三重Des算法和python之间的概念时遇到了问题。在java中,加密密钥的长度为48个字符,而在python中不能应用相同的密钥。我尝试了上面提到的两种建议,但两种方法似乎都不起作用。我无法在python中解密java加密的字符串。java中的代码如下所示: import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey;

我在理解java的三重Des算法和python之间的概念时遇到了问题。在java中,加密密钥的长度为48个字符,而在python中不能应用相同的密钥。我尝试了上面提到的两种建议,但两种方法似乎都不起作用。我无法在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);
      }
导入java.security.spec.KeySpec;
导入javax.crypto.Cipher;
导入javax.crypto.SecretKey;
导入javax.crypto.SecretKeyFactory;
导入javax.crypto.spec.DESedeKeySpec;
公共类SecretKeyEncryptionExample
{
专用静态最终字符串格式=“ISO-8859-1”;
公共静态最终字符串DESEDE\u ENCRYPTION\u SCHEME=“DESEDE”;
私钥;
私人秘密工厂skf;
专用密码;
秘钥;
public SecretKeyEncryptionExample()
抛出异常
{
字符串myEncryptionKey=“”;
this.ks=新的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
从pyDes导入*
导入hashlib
导入base64
key1=“.decode('hex'))
data=“”
k=triple_des(第1键,ECB,“\0\0\0\0\0\0”,pad=None,padmode=pad_PKCS5)
e=k.解密(数据)
打印e
我按照给出的第一个建议做了,但它没有打印任何内容。我再次尝试了同一页中的第二个建议,要求使用前24个字符作为键,忽略其余字符作为键:

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
从pyDes导入*
导入hashlib
导入base64
键1=“”
data=“”
k=triple_des(第1键,ECB,“\0\0\0\0\0\0”,pad=None,padmode=pad_PKCS5)
e=k.解密(数据)
打印e

但这也没有给我任何输出。我对所有这些研究感到困惑。请建议哪种方法是正确的,以及为什么我没有从这两种方法中获得任何输出。谢谢。

据我所知,在Python脚本中,您是十六进制解码。然而,在Java代码中,您是将字符串本身转换为字节

尝试以下方法:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");
比如:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");

据我所知,在Python脚本中,您正在进行十六进制解码。然而,在Java代码中,您正在将字符串本身转换为字节

尝试以下方法:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");
比如:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");

据我所知,在Python脚本中,您正在进行十六进制解码。然而,在Java代码中,您正在将字符串本身转换为字节

尝试以下方法:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");
比如:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");

据我所知,在Python脚本中,您正在进行十六进制解码。然而,在Java代码中,您正在将字符串本身转换为字节

尝试以下方法:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");
比如:

String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));
Cipher.getInstance("DESede/ECB/PKCS5Padding");

Oracle JDK的默认填充为PKCS5。据报道,这与Android甚至其他JDK不同

(此外,Java会修剪超过24个字符的密钥。它不会引发类似于pydes的异常)

据我所知,ECB模式下的Java实现没有默认IV

但是,如果您正在创建从Java到Python的直接端口,那么这可能会实现以下目的:

triple_des(key1, ECB, pad=None, pad_mode=PAD_PKCS5)

Oracle JDK的默认填充为PKCS5。据报道,这与Android甚至其他JDK不同

(此外,Java会修剪超过24个字符的密钥。它不会引发类似于pydes的异常)

据我所知,ECB模式下的Java实现没有默认IV

但是,如果您正在创建从Java到Python的直接端口,那么这可能会实现以下目的:

triple_des(key1, ECB, pad=None, pad_mode=PAD_PKCS5)

Oracle JDK的默认填充为PKCS5。据报道,这与Android甚至其他JDK不同

(此外,Java会修剪超过24个字符的密钥。它不会引发类似于pydes的异常)

据我所知,ECB模式下的Java实现没有默认IV

但是,如果您正在创建从Java到Python的直接端口,那么这可能会实现以下目的:

triple_des(key1, ECB, pad=None, pad_mode=PAD_PKCS5)

Oracle JDK的默认填充为PKCS5。据报道,这与Android甚至其他JDK不同

(此外,Java会修剪超过24个字符的密钥。它不会引发类似于pydes的异常)

据我所知,ECB模式下的Java实现没有默认IV

但是,如果您正在创建从Java到Python的直接端口,那么这可能会实现以下目的:

triple_des(key1, ECB, pad=None, pad_mode=PAD_PKCS5)

你的回答很有帮助。它解决了这个问题。如果我使用getInstance(“DESede”),请再告诉我一件事只有这样,java才会默认采用哪种模式?@Tirthajust4u Oracle提供程序倾向于默认为ECB模式和PKCS#5填充。不确定其他提供程序。因此,为什么总是建议使用显式。您的回答非常有用。它解决了问题。如果我使用getInstance(“DESede”),请再告诉我一件事只有这样,java才会默认采用哪种模式?@Tirthajust4u Oracle提供程序倾向于默认为ECB模式和PKCS#5填充。不确定其他提供程序。因此,为什么总是建议使用显式。您的回答非常有用。它解决了问题。如果我使用getInstance(“DESede”),请再告诉我一件事只有这样,java才会默认采用哪种模式?@Tirthajust4u Oracle提供程序倾向于默认为ECB模式和PKCS#5填充。不确定其他提供程序。因此,为什么总是建议使用显式。您的回答非常有用。它解决了问题。如果我使用getInstance(“DESede”),请再告诉我一件事只有这样,java才会默认采用哪种模式?@Tirthajust4u Oracle提供程序倾向于默认为ECB模式和PKCS#5填充。不确定其他提供程序。因此,为什么总是建议显式。