如何使用 CBC 实现 Java 256 位 AES 加密
我已经阅读了以下线程,它们有所帮助,但我正在寻找更多信息。
如何为黑莓编写AES / CBC / PKCS5使用初始化矢量参数进行加密和解密
基本上,我正在做的是编写一个程序,该程序将加密通过TCP / IP发送的请求,然后由服务器程序解密。加密需要是AES,做一些研究,我发现我需要使用CBC和PKCS5Padding。所以基本上我需要一个密钥和一个IV。
我正在开发的应用程序是针对手机的,所以我想使用java安全包来减小大小。我已经完成了设计,但不确定IV和共享密钥的实现。
下面是一些代码:
// My user name
byte[] loginId = "login".getBytes();
byte[] preSharedKey128 = "ACME-1234AC".getBytes();
byte[] preSharedKey192 = "ACME-1234ACME-1234A".getBytes();
// 256 bit key
byte[] preSharedKey256 = "ACME-1234ACME-1234ACME-1234".getBytes();
byte[] preSharedKey = preSharedKey256;
// Initialization Vector
// Required for CBC
byte[] iv ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
IvParameterSpec ips = new IvParameterSpec(iv);
byte[] encodedKey = new byte[loginId.length + preSharedKey.length];
System.arraycopy(loginId, 0, encodedKey, 0, loginId.length);
System.arraycopy(preSharedKey, 0, encodedKey, loginId.length, preSharedKey.length);
// The SecretKeySpec provides a mechanism for application-specific generation
// of cryptography keys for consumption by the Java Crypto classes.
// Create a key specification first, based on our key input.
SecretKey aesKey = new SecretKeySpec(encodedKey, "AES");
// Create a Cipher for encrypting the data using the key we created.
Cipher encryptCipher;
encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Initialize the Cipher with key and parameters
encryptCipher.init(Cipher.ENCRYPT_MODE, aesKey, ips);
// Our cleartext
String clearString = "33,8244000,9999,411,5012022517,0.00,0,1,V330";
byte[] cleartext = clearString.getBytes();
// Encrypt the cleartext
byte[] ciphertext = encryptCipher.doFinal(cleartext);
// Now decrypt back again...
// Decryption cipher
Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Initialize PBE Cipher with key and parameters
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey, ips);
// Decrypt the cleartext
byte[] deciphertext = decryptCipher.doFinal(ciphertext);
简而言之,它应该做的是加密一些可以由服务器解密的消息,而无需服务器从手机中获取密钥或IV。有没有办法做到这一点,我可以保护手机上的IV和密钥,并且仍然拥有服务器知道的密钥和IV?如果不是,请随时告诉我要使事情更清楚。