将 Blowfish 加密从 Java 转换为 Python
Convert Blowfish Encryption from Java to Python
我正在尝试将我的 Java Blowfish 加密算法转换为 Python。我正在使用河豚包,它采用与 Java 库相同的参数。它们都执行成功,但是,我没有得到相同的结果。
Java代码
public static void main(String[] args) {
try {
String mainText = "hello world";
String stBlowfishIv = "zzyyxxaa";
String stBlowfishKey = "how.good";
byte[] byteString;
IvParameterSpec iv = new IvParameterSpec(stBlowfishIv.getBytes());
SecretKey key = new SecretKeySpec(stBlowfishKey.getBytes(), "Blowfish");
Cipher c = Cipher.getInstance("Blowfish/CFB/NoPadding");
c.init(Cipher.ENCRYPT_MODE, key, iv);
byteString = c.doFinal(mainText.getBytes());
System.out.println(Arrays.toString(byteString));
}
catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
输出
[47, -19, 48, -42, 19, 126, -105, 66, 21, -126, -44]
Python代码
def encrypt(self, initVector="zzyyxxaa", key="how.good"):
totalString = "hello world"
initVectorBytes = bytes(initVector, 'utf-8')
keyBytes = bytes(key, 'utf-8')
totalStringBytes = bytes(totalString, 'utf-8')
cipher = blowfish.Cipher(keyBytes)
dataEncrypted = b"".join(cipher.encrypt_cfb(totalStringBytes, initVectorBytes))
print(dataEncrypted)
for byte in dataEncrypted:
print(byte, end=' ')
输出
b'/\xed0\xd6\x13~\x97B\x15\x82\xd4'
47 237 48 214 19 126 151 66 21 130 212
非常感谢一些帮助或指导。
Java输出
[47, -19, 48, -42, 19, 126, -105, 66, 21, -126, -44]
Python输出
47 237 48 214 19 126 151 66 21 130 212
它们代表完全相同的位模式,因此您的代码有效。
明显的区别在于 Java 中的 byte
类型是 signed。请注意,唯一的区别是在 Java 输出中显示为负值的输出字节。
以第一个差异为例,-19
vs 237
,两者的位模式都是0xED
,或二进制1110 1101
。如果解释为无符号,则值为 237
,但如果解释为有符号,则值为 -19
.
我正在尝试将我的 Java Blowfish 加密算法转换为 Python。我正在使用河豚包,它采用与 Java 库相同的参数。它们都执行成功,但是,我没有得到相同的结果。
Java代码
public static void main(String[] args) {
try {
String mainText = "hello world";
String stBlowfishIv = "zzyyxxaa";
String stBlowfishKey = "how.good";
byte[] byteString;
IvParameterSpec iv = new IvParameterSpec(stBlowfishIv.getBytes());
SecretKey key = new SecretKeySpec(stBlowfishKey.getBytes(), "Blowfish");
Cipher c = Cipher.getInstance("Blowfish/CFB/NoPadding");
c.init(Cipher.ENCRYPT_MODE, key, iv);
byteString = c.doFinal(mainText.getBytes());
System.out.println(Arrays.toString(byteString));
}
catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
输出
[47, -19, 48, -42, 19, 126, -105, 66, 21, -126, -44]
Python代码
def encrypt(self, initVector="zzyyxxaa", key="how.good"):
totalString = "hello world"
initVectorBytes = bytes(initVector, 'utf-8')
keyBytes = bytes(key, 'utf-8')
totalStringBytes = bytes(totalString, 'utf-8')
cipher = blowfish.Cipher(keyBytes)
dataEncrypted = b"".join(cipher.encrypt_cfb(totalStringBytes, initVectorBytes))
print(dataEncrypted)
for byte in dataEncrypted:
print(byte, end=' ')
输出
b'/\xed0\xd6\x13~\x97B\x15\x82\xd4'
47 237 48 214 19 126 151 66 21 130 212
非常感谢一些帮助或指导。
Java输出
[47, -19, 48, -42, 19, 126, -105, 66, 21, -126, -44]
Python输出
47 237 48 214 19 126 151 66 21 130 212
它们代表完全相同的位模式,因此您的代码有效。
明显的区别在于 Java 中的 byte
类型是 signed。请注意,唯一的区别是在 Java 输出中显示为负值的输出字节。
以第一个差异为例,-19
vs 237
,两者的位模式都是0xED
,或二进制1110 1101
。如果解释为无符号,则值为 237
,但如果解释为有符号,则值为 -19
.