C# Java编码和.NET解码
加密采用java语言:C# Java编码和.NET解码,c#,java,rijndaelmanaged,C#,Java,Rijndaelmanaged,加密采用java语言: String salt = "DC14DBE5F917C7D03C02CD5ADB88FA41"; String password = "25623F17-0027-3B82-BB4B-B7DD60DCDC9B"; char[] passwordChars = new char[password.length()]; password.getChars(0,password.length(), passwordChars, 0); SecretKeyFactory
String salt = "DC14DBE5F917C7D03C02CD5ADB88FA41";
String password = "25623F17-0027-3B82-BB4B-B7DD60DCDC9B";
char[] passwordChars = new char[password.length()];
password.getChars(0,password.length(), passwordChars, 0);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(passwordChars, salt.getBytes(), 2, 256);
SecretKey sKey = factory.generateSecret(spec);
byte[] raw = _sKey.getEncoded();
String toEncrypt = "The text to be encrypted.";
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, skey);
AlgorithmParameters params = cipher.getParameters();
byte[] initVector = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] encryptedBytes = cipher.doFinal(toEncrypt.getBytes());
在c#中进行解密时:
解密失败,出现异常“填充无效,无法删除。”
知道可能是什么问题吗?这通常表示解密失败。我建议您检查密钥生成函数的输出,看看是否实际使用了相同的密钥。例如,我注意到,Java代码暗示您使用的是基于SHA1的HMAC,而.NET代码暗示您使用的是一个未知的SHA1哈希来生成密钥
或者,可能是填充不匹配。我看不出您在.NET代码中将
PaddingMode
明确设置为PKCS7的位置。谢谢您的回复。基本上,我是在编写java端的代码,对.NET端没有控制权。但是,我有双方的源代码,在调试.NET端时,它显示了PKCS7。我想我的问题是,我应该在java端做什么来匹配现有的.NET解密?在.NET中默认的PaddingMode
是PKCS7,我刚刚检查过。因此,我怀疑密钥生成中存在差异PasswordDeriveBytes
使用PBKDF1算法,而Java代码使用PBKDF2。我不太熟悉Java中的可用功能,但是有没有一种方法可以使用PBKDF1?嗨,David。你说得对,钥匙不匹配。原来BouncyCastle有一个专门为此构建的类。org.bouncycastle.crypto.generators.pkcs5s1参数生成器我发现这个线程非常有用:它现在可以工作了。谢谢你的洞察力。
string hashAlgorithm = "SHA1";
int passwordIterations = 2;
int keySize = 256;
byte[] saltValueBytes = Encoding.ASCII.GetBytes( salt );
byte[] cipherTextBytes = Convert.FromBase64String( cipherText );
PasswordDeriveBytes passwordDB = new PasswordDeriveBytes(password, saltValueBytes, hashAlgorithm passwordIterations );
byte[] keyBytes = passwordDB.GetBytes( keySize / 8 );
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor( keyBytes, initVector );
MemoryStream memoryStream = new MemoryStream( cipherTextBytes );
CryptoStream cryptoStream = new CryptoStream( memoryStream, decryptor, CryptoStreamMode.Read );
byte[] plainTextBytes = new byte[ cipherTextBytes.Length ];
int decryptedByteCount = cryptoStream.Read( plainTextBytes, 0, plainTextBytes.Length );
memoryStream.Close();
cryptoStream.Close();
string plainText = Encoding.UTF8.GetString( plainTextBytes, 0, decryptedByteCount );