【发布时间】:2021-01-14 17:24:18
【问题描述】:
我有这个使用 3DES 加密对密码进行加密的有效 java 代码-
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Main{
public static void main(String[] args) throws Exception {
String text = "aug@2019";
String codedtext = new Main().encrypt(text);
System.out.println(codedtext);
}
public String encrypt(String message) throws Exception {
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest("Lgp!kdao2020"
.getBytes("utf-8"));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
final String encodedCipherText = new String(java.util.Base64.getMimeEncoder().encode(cipherText),
"UTF-8");
return encodedCipherText;
}
}
我想在 Python 中进行相同的加密,所以从两个代码生成的加密是相同的,这是我的 python 代码
import base64
from Crypto.Cipher import AES
import pyDes
from Crypto import Random
import hashlib
def encrypt(message, passkey):
hash_object = hashlib.md5(passkey.encode("utf-8"))
digested_passkey = hash_object.digest()
print(digested_passkey)
key24 = digested_passkey[:24]
des = pyDes.des(key24);
message = message.encode('utf-8')
message = message + (16 - len(message) % 16) * chr(16 - len(message) % 16)
iv = Random.new().read(AES.block_size)
cipher = AES.new(des, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(message))
print(encrypt('aug@2019', 'Lgp!kdao2020'))
我收到一个错误 -> ValueError: Invalid DES key size。密钥的长度必须正好为 8 个字节。
【问题讨论】:
-
pyDes.des(..)是单个 DES .. 3DES 被命名为pyDes.triple_des(...)。但是你为什么要在 DES/3DES 中实现新的东西呢? AES 应该是首选.. -
@EbbeM.Pedersen 如何在 python 中使用 AES 实现相同的加密逻辑并实现匹配的加密短语(在 java 中检索)。我是加密方法的新手 :)
-
同样在使用 pyDes.triple_des(key24) 更新我的代码后,我得到另一个 TypeError - can't concat str to bytes at message = message + (16 - len(message) % 16) * chr(16 - len(message) % 16)
标签: java python encryption