![](/img/trans.png)
[英]What is API in OpenSSL like Java DES/CBC/PKCS5Padding?
[英]Converting java code for 3DES Encryption with md5 message digest and DESede/CBC/PKCS5Padding to python
我有这个工作的 java 代码,它使用 3DES 加密来加密密码-
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 个字节长。
两个代码之间有很多区别:
{: <24}
更改为[:24]
并没有真正使它变得更好)。 最后的第二个变化, digested_passkey[:24]
,与digested_passkey
相同并且有效,因为PyCryptodome根据2-key Triple DES 自动将密钥扩展到24 个字节。除此之外,如评论中已经提到的,所使用的算法不安全(MD5)或过时/缓慢(三重 DES)。 同样,作为 IV 的 0 向量是完全不安全的。
import base64
#from Crypto.Cipher import AES
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad
#import pyDes
#from Crypto import Random
import hashlib
def encrypt(message, passkey):
#hash_object = hashlib.md5(passkey.encode("utf-8"))
hash_object = hashlib.md5(passkey)
digested_passkey = hash_object.digest()
print(digested_passkey)
#key24 = "[:24]".format(digested_passkey)
key24 = digested_passkey + digested_passkey[0:8] # Derive key as in Java
#des = pyDes.des(key24); # Remove pyDes
#message = message.encode('utf-8')
#message = message + (16 - len(message) % 16) * chr(16 - len(message) % 16)
message = pad(message, 8) # Use padding from PyCryptodome
#iv = Random.new().read(AES.block_size) # For Java code compliance: Use 0-IV
iv = bytes.fromhex('0000000000000000')
#cipher = AES.new(des, AES.MODE_CBC, iv) # For Java code compliance: Use TripleDES
cipher = DES3.new(key24, DES3.MODE_CBC, iv)
#return base64.b64encode(iv + cipher.encrypt(message)) # For Java code compliance: Don't concatenate IV and ciphertext
return base64.b64encode(cipher.encrypt(message))
#print(encrypt('aug@2019', 'Lgp!kdao2020')) # Better: Pass binary data
print(encrypt(b'aug@2019', b'Lgp!kdao2020'))
它给出了 Java 代码( 7B0aNUwOU1ECqKqnIZs6mQ==
)的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.