首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的DESede和python中的3des

Java中的DESede和python中的3des
EN

Stack Overflow用户
提问于 2014-02-24 08:23:19
回答 2查看 4.9K关注 0票数 0

我在理解java和python的三重Des算法之间的概念时遇到了问题。在java中,加密的密钥是48个字符,而在python情况下不能应用相同的密钥。我尝试了上述两种建议-- here,但这两种方法似乎都不起作用。我无法在python中解密用java加密的字符串。java中的代码如下所示:

代码语言:javascript
运行
复制
    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中,如果我使用:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 16:57:33

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

试一试如下:

代码语言:javascript
运行
复制
String myEncryptionKey = "<48 chars long string>";
this.ks = new DESedeKeySpec(DatatypeConverter.parseHexBinary(myEncryptionKey));

此外,确保您充分指定您的密码算法,以避免可移植性问题。因此,替换:

代码语言:javascript
运行
复制
Cipher.getInstance("DESede");

有这样的东西:

代码语言:javascript
运行
复制
Cipher.getInstance("DESede/ECB/PKCS5Padding");
票数 2
EN

Stack Overflow用户

发布于 2018-08-28 02:53:39

Oracle具有默认的PKCS5填充。据报道,这对于Android甚至其他JDK来说是不同的。

(此外,Java为超过24个字符的任何内容设置键。它不会引发类似于pydes的异常)

据我所知,欧洲央行模式下的Java实现没有默认的IV。

但是,如果您要从Java到Python做一个直接端口,这可能只会做到这一点:

代码语言:javascript
运行
复制
triple_des(key1, ECB, pad=None, pad_mode=PAD_PKCS5)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21982389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档