c# - 使用随机 IV 在 C# 中加密/解密字符串时遇到问题
问题描述
我正在重写一些代码以在我的加密字符串前面添加一个随机 IV。我认为加密是正确的(无法解密,所以我不是 100% 确定),但问题是当我运行解密功能时,出现异常
System.Security.Cryptography.CryptographicException: 'The input data is not a complete block.'
下面是源代码。有谁知道我要去哪里错了?我认为错误出在 binaryWritr.Write 调用中,但经过几次迭代,我没有取得进展。任何帮助将不胜感激!
public static string EncryptString(string inputText)
{
using(var aes = new AesCryptoServiceProvider() {
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7
}) {
var input = Encoding.UTF8.GetBytes(inputText);
aes.GenerateIV();
var iv = aes.IV;
using(var encrypter = aes.CreateEncryptor(aes.Key, iv))
using(var cipherStream = new MemoryStream()) {
using(var tCryptoStream = new CryptoStream(cipherStream, encrypter, CryptoStreamMode.Write))
using(var tBinaryWriter = new BinaryWriter(tCryptoStream)) {
//Prepend IV to data
cipherStream.Write(iv, 0, iv.Length);
tBinaryWriter.Write(input);
tCryptoStream.FlushFinalBlock();
}
return Convert.ToBase64String(cipherStream.ToArray());
}
}
}
public static string DecryptString(string inputText)
{
var aes = new AesCryptoServiceProvider() {
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7
};
//get first 16 bytes of IV and use it to decrypt
var iv = new byte[16];
Array.Copy(Encoding.ASCII.GetBytes(inputText), 0, iv, 0, iv.Length);
using(var ms = new MemoryStream()) {
using(var cs = new CryptoStream(ms, aes.CreateDecryptor(aes.Key, iv), CryptoStreamMode.Write))
using(var binaryWriter = new BinaryWriter(cs)) {
//Decrypt Cipher Text from Message
binaryWriter.Write(
Encoding.ASCII.GetBytes(inputText),
iv.Length,
inputText.Length - iv.Length
);
}
return Encoding.Default.GetString(ms.ToArray());
}
}
解决方案
推荐阅读
- environment-variables - GNU make .env:6: *** 未终止的变量引用。停止
- flutter - 在flutter webview应用程序中删除网站浮动操作按钮
- python - 合并来自 Github Repository Link 的所有 csv 文件并使其成为一个 csv 文件
- nginx - 为什么代理传递不适用于 set $variable?
- ssl - azure windows server 2016 上的启动脚本
- android - 什么是 sdk_version:“module_current”与 sdk_version:“system_current”?
- java - Java 扫描器如何正确读取字符串
- android - 从图像选择器打开相机时,应用程序“失去与设备的连接”会颤抖。
- javascript - 如何获取地图中的每个元素并更改其 CSS?
- python - 为什么维特比算法(POS标注)总是预测一个标签?