我正在弄清楚如何使用 进行跨平台(Android 和 Python)加密和解密,如果我使用基于 IVAES
的话,我似乎可以成功传输数据。String
但是,如果我立即切换到使用 生成的字节SecureRandom.generateSeed()
,它就会出错。密钥是预先共享的。
工作 Android 代码(删除 try/catch 块以保持简短):
String SecretKey = "0123456789abcdef";
String iv = "fedcba9876543210";
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
SecretKeySpec keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//Initialize the cipher
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
String message = "What's up?";
byte[] encrypted = cipher.doFinal(message.getBytes());
//Send the data
outputStream.write(encrypted);
有一个小的传输标头可以让客户端知道传入消息的大小,但我认为它不相关,因此我将其省略了。接收此消息的 Python 代码如下所示:
#Predefined:
unpad = lambda s : s[0:-ord(s[-1])]
encrypted = cs.recv(messagesize) # Receive the encrypted message
iv = encrypted[:16]
key = AES.new('0123456789abcdef', AES.MODE_CBC,IV=iv)
padded_msg = key.decrypt(encrypted[16:])
decrypted = unpad(padded_msg) #Remove padding
print "read [%s]" % decrypted
结果如下:
read [What's up]
如果我在 Java 代码中更改两行:
SecureRandom rnd = new SecureRandom();
IvParameterSpec ivspec = new IvParameterSpec(rnd.generateSeed(16));
Python 输出变为:
read [?=H��m��lڈ�1ls]
我想知道 SecureRandom 有什么变化?我读到默认情况下 String.getBytes() 返回平台默认编码(for Android 4.0
),所以我想知道是否必须在 Python 端对使用 SecureRandom 生成的 IV 进行一些操作..?