由于我对 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-¾`*ã”
使用您的示例,我得到了 python 和 Java 的相同输出。
爪哇:
import java.math.BigInteger;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Blowfish1 {
public static void main(String[] args) throws Exception {
String s = "testings";
Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
Key key = new SecretKeySpec("6#26FRL$ZWD".getBytes(), "Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] enc_bytes = cipher.doFinal(s.getBytes());
System.out.printf("%x%n", new BigInteger(1, enc_bytes));
}
}
蟒蛇:
from Crypto.Cipher import Blowfish
import binascii
# See @falsetru answer for the following method
#
def PKCS5Padding(string):
byteNum = len(string)
packingLength = 8 - byteNum % 8
appendage = chr(packingLength) * packingLength
return string + appendage
def PandoraEncrypt(string):
key = b'6#26FRL$ZWD'
c1 = Blowfish.new(key, Blowfish.MODE_ECB)
packedString = PKCS5Padding(string)
return c1.encrypt(packedString)
if __name__ == '__main__':
s = 'testings'
c = PandoraEncrypt(s)
print(binascii.hexlify(c))
在这两种情况下,输出都是
223950ff19fbea872fce0ee543692ba7
def PKCS5Padding(string):
byteNum = len(string)
packingLength = 8 - byteNum % 8
appendage = chr(packingLength) * packingLength
return string + appendage
使用 chr 而不是 str.
>>> chr(1)
'\x01'
>>> str(1)
'1'
str * int -> 重复的 str
>>> '!' * 5
'!!!!!'
https://stackoverflow.com/a/17139643/1645017 python2 的正确答案。
对于 python 3https://pycryptodome.readthedocs.io/en/latest/index.html`
from Crypto.Cipher import Blowfish
import binascii
# See @falsetru answer for the following method
#
def PKCS5Padding(string):
byteNum = len(string)
packingLength = 8 - byteNum % 8
appendage = chr(packingLength).encode() * packingLength
return string + appendage
def PandoraEncrypt(string):
key = b'6#26FRL$ZWD'
c1 = Blowfish.new(key, Blowfish.MODE_ECB)
packedString = PKCS5Padding(string)
return c1.encrypt(packedString)
if __name__ == '__main__':
s = b'testings'
c = PandoraEncrypt(s)
print(binascii.hexlify(c))`