java - DES3、triple_des加密的问题

查看:219
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆