【发布时间】:2013-06-17 10:26:56
【问题描述】:
由于我对 Java 的不完整了解,我很难将此加密代码转换为 Python 代码。两者应该有完全相同的结果。非常感谢您的帮助。
Java 函数
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
String s = "testings";
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
Key key = new SecretKeySpec("6#26FRL$ZWD".getBytes(), "Blowfish");
cipher.init(1, key);
byte[] enc_bytes = cipher.doFinal(s.getBytes());
System.out.println(enc_bytes);
}
}
Python 等价物
def PKCS5Padding(string):
byteNum = len(string)
packingLength = 8 - byteNum % 8
if packingLength == 8:
return string
else:
appendage = chr(packingLength) * packingLength
return string + appendage
def PandoraEncrypt(string):
from Crypto.Cipher import Blowfish
key = b'6#26FRL$ZWD'
c1 = Blowfish.new(key, Blowfish.MODE_ECB)
packedString = PKCS5Padding(string)
return c1.encrypt(packedString)
结果
Java 函数:“??¾ô”
Python 函数:“Ë4A-¾`*ã”
【问题讨论】:
-
我认为您的 PKCS5Padding 在
packingLength == 8的情况下是错误的。见RFC 2898, section 6.1 -
谢谢,我已经做了相应的修改
-
那些输出毫无意义。您可能应该打印十六进制编码的输出。在 python 中使用 binascii.hexlify,在 Java 中它不是那么简单,但是你会在网上找到很多例子。
-
是的,但即使转换为十六进制,它们也不相等。我需要一个精确的副本供第三方扩展读取。第三方接收加密,因此他们必须是平等的。它是为 Java 设计的,但就我的项目而言,Python 更方便。
标签: java python encryption blowfish ecb