跨平台上的AES cbc填充加密/解密(.net c#和代号为一个充气城堡)

加密/解密在跨平台中不起作用。

我使用此链接使用代号为one的充气城堡AES密码加密/解密文本。

使用J2ME中的Bouncycastle示例进行AES加密/解密

从服务器端(.net),我使用此链接实现相同的方法。

AES 128bit Cross Platform (Java and C#) Encryption Compatibility

现在我没有收到任何错误但是从代号加密不会在服务器端完全解密,反之亦然。

任何人请帮我解决这个问题。

Codename代码:

import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.CryptoException; import org.bouncycastle.crypto.engines.AESEngine; import org.bouncycastle.crypto.modes.CBCBlockCipher; import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV; import org.bouncycastle.util.encoders.Base64; public class Test { private static PaddedBufferedBlockCipher cipher = null; public static void main(String[] args) { try { byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8"); byte[] iv = new byte[16]; PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher( new CBCBlockCipher( new AESEngine()) ); //Encryption String plainText = "Hello How are you !2#&*()% 123456@"; byte[] plainData = plainText.getBytes("UTF-8"); KeyParameter keyParam = new KeyParameter(key); CipherParameters ivAndKey = new ParametersWithIV(keyParam, iv); cipher.init(true, ivAndKey); byte[] ciptherBytes = cipherData(plainData); //48 String cipherText = new String(Base64.encode(ciptherBytes), "UTF-8");//FileUtil.getStringFromByteArray(Base64.encode(ciptherBytes)); System.out.println("encrypted >> "+cipherText); //Decryption byte[] cipherData = Base64.decode(cipherText); ivAndKey = new ParametersWithIV(keyParam, iv); cipher.init(false, ivAndKey); plainText = new String(cipherData(cipherData), "UTF-8");//FileUtil.getStringFromByteArray(cipherData(cipherData)); System.out.println("decrypted >> "+plainText); } catch (Exception e) { e.printStackTrace(); } } private static byte[] cipherData(byte[] data) throws CryptoException { int minSize = cipher.getOutputSize(data.length); byte[] outBuf = new byte[minSize]; int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); int length2 = cipher.doFinal(outBuf, length1); int actualLength = length1 + length2; byte[] result = new byte[actualLength]; System.arraycopy(outBuf, 0, result, 0, result.length); return result; } 

来自.net的代码:

  public static RijndaelManaged GetRijndaelManaged(String secretKey) { var keyBytes = new byte[16]; var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey); Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length)); return new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.PKCS7, KeySize = 128, BlockSize = 128, Key = keyBytes, IV = keyBytes }; } public static byte[] EncryptCBC(byte[] plainBytes, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateEncryptor() .TransformFinalBlock(plainBytes, 0, plainBytes.Length); } public static byte[] DecryptCBC(byte[] encryptedData, RijndaelManaged rijndaelManaged) { return rijndaelManaged.CreateDecryptor() .TransformFinalBlock(encryptedData, 0, encryptedData.Length); } public static String EncryptCBCStr(String plainText, String key) { var plainBytes = Encoding.UTF8.GetBytes(plainText); return Convert.ToBase64String(EncryptCBC(plainBytes, GetRijndaelManaged(key))); } public static String DecryptCBCStr(String encryptedText, String key) { var encryptedBytes = Convert.FromBase64String(encryptedText); return Encoding.UTF8.GetString(DecryptCBC(encryptedBytes, GetRijndaelManaged(key))); } // call var PlainText = "Hello How are you !2#&*()% 123456@"; var EncryptionKey = "MAKV2SPBNI992122"; var cypherCBC = EncryptCBCStr(PlainText, EncryptionKey); var decryptCBC = DecryptCBCStr(cypherCBC, EncryptionKey); 

谢谢你。

这个问题已得到解决……它只是关键/ IV字节问题。在.net中有相同的密钥和IV在java中我使用了不同的IV。

在java代码中更正:

而不是这个

 byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8"); byte[] iv = new byte[16]; 

用这个。

 byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8"); byte[] iv = "MAKV2SPBNI992122".getBytes("UTF-8");