c# - Java 编码和 .NET 解码

标签 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 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#中解密时:


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 );

解密失败,出现异常“填充无效,无法删除。”

知道可能是什么问题吗?

最佳答案

这一般表示解密失败。我建议你检查 key 生成函数的输出,看看你是否真的使用了相同的 key 。例如,我注意到 Java 代码暗示您正在使用基于 SHA1 的 HMAC,而 .NET 代码暗示您正在使用未加密的 SHA1 哈希来生成 key 。

或者,也可能是填充不匹配。我没有看到您在 .NET 代码中将 PaddingMode 显式设置为 PKCS7 的位置。

关于c# - Java 编码和 .NET 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2121047/

相关文章:

c# - 如何使用 autofac 注册两个 WCF 服务契约(Contract)

java - GAE 启动动态实例来服务请求而不是使用空闲的常驻实例

java - 带有数组对象的 FileScanner

security - 如何预先确定加密操作中生成的密文的长度?

c# - 委托(delegate) DynamicInvoke 与 MethodInfo 调用?

c# - Wpf 应用程序卡在主线程上,没有明显的锁

AES/Rijndael 测试向量 : what padding mode?

c# - 使用 Java 解密由 .NET 的 RijndaelManaged 加密的字节

c# - 实体之间的一对一关系不适用于 Entity Framework 6

java - 在命令提示符或 Eclipse 中制作 java 项目(带有一些类)的 .jar 文件?