- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我从 .net 4.5 转换到 .net core 2 时收到以下错误消息。代码完全相同。我看过一些帖子,但没有一个能解决这个错误。我正在使用 RijndaelManaged 加密。
Specified padding mode is not valid for this algorithm.
at Internal.Cryptography.UniversalCryptoDecryptor.DepadBlock(Byte[] block, Int32 offset, Int32 count)
at Internal.Cryptography.UniversalCryptoDecryptor.UncheckedTransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at Internal.Cryptography.UniversalCryptoTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at System.IO.StreamReader.Dispose(Boolean disposing)
at System.IO.TextReader.Dispose()
下面是我正在使用的代码。我在以下位置收到错误:retval = srDecrypt.ReadToEnd();
public static class EncryptionExtension
{
#region "Enumerations"
public enum EncryptionAlgorithms
{
Rijndael = 0
}
public enum CryptMethod
{
Encrypt = 0,
Decrypt = 1
}
#endregion
#region "Private Attributes"
private static byte[] CRYPT_SALT = {
99,
115,
120,
76,
105,
103,
105,
116
};
private static byte[] IV_8 = new byte[] {
2,
63,
9,
36,
235,
174,
78,
12
};
private static byte[] IV_16 = new byte[] {
15,
199,
56,
77,
244,
126,
107,
239,
9,
10,
88,
72,
24,
202,
31,
108
};
private static byte[] IV_24 = new byte[] {
37,
28,
19,
44,
25,
170,
122,
25,
25,
57,
127,
5,
22,
1,
66,
65,
14,
155,
224,
64,
9,
77,
18,
251
};
private static byte[] IV_32 = new byte[] {
133,
206,
56,
64,
110,
158,
132,
22,
99,
190,
35,
129,
101,
49,
204,
248,
251,
243,
13,
194,
160,
195,
89,
152,
149,
227,
245,
5,
218,
86,
161,
124
#endregion
};
#region "String Encryption"
public static string EncryptString(EncryptionAlgorithms Method, string Value, string Key)
{
return CryptString(CryptMethod.Encrypt, Method, Value, Key);
}
public static string DecryptString(EncryptionAlgorithms Method, string Value, string Key)
{
return CryptString(CryptMethod.Decrypt, Method, Value, Key);
}
public static string CryptString(CryptMethod Method, EncryptionAlgorithms Algorithm, string Value, string Key)
{
// Check arguments.
if (Value == null || Value.Length <= 0)
{
throw new ArgumentNullException("Data can not be empty");
}
if (Key == null || Key.Length <= 0)
{
throw new ArgumentNullException("Key can not be empty");
}
SymmetricAlgorithm provider = null;
string retval = null;
// Declare the stream used to encrypt to an in memory array of bytes.
MemoryStream msCrypt = null;
ICryptoTransform ICrypt = null;
try
{
// Create a Provider object
switch (Algorithm)
{
case EncryptionAlgorithms.Rijndael:
provider = new RijndaelManaged();
break;
}
provider.KeySize = provider.LegalKeySizes[0].MaxSize;
provider.BlockSize = provider.LegalBlockSizes[0].MaxSize;
provider.Key = DerivePassword(Key, provider.LegalKeySizes[0].MaxSize / 8);
switch (provider.BlockSize / 8)
{
case 8:
provider.IV = IV_8;
break;
case 16:
provider.IV = IV_16;
break;
case 24:
provider.IV = IV_24;
break;
case 32:
provider.IV = IV_32;
break;
}
if (Method == CryptMethod.Encrypt)
{
////encrypt value
//// Create a encryptor to perform the stream transform.
//ICrypt = provider.CreateEncryptor(provider.Key, provider.IV);
//// Create the streams used for encryption/decryption
//msCrypt = new MemoryStream();
//using (CryptoStream csEncrypt = new CryptoStream(msCrypt, ICrypt, CryptoStreamMode.Write))
//{
// using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
// {
// //Write all data to the stream.
// swEncrypt.Write(Value);
// }
//}
}
else
{
//decrypt value
//convert the ciphered text into a byte array
byte[] cipherBytes = null;
cipherBytes = System.Convert.FromBase64String(Value);
// Create a deccryptor to perform the stream transform.
ICrypt = provider.CreateDecryptor(provider.Key, provider.IV);
// Create the streams used for decryption.
msCrypt = new MemoryStream(cipherBytes);
using (CryptoStream csDecrypt = new CryptoStream(msCrypt, ICrypt, CryptoStreamMode.Write))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
//Read the decrypted bytes from the decrypting stream
// and place them in a string.
retval = srDecrypt.ReadToEnd();
}
}
}
}
catch (Exception ex)
{
//throw new AceExplorerException(ex.Message + " " + ex.StackTrace + " " + ex.TargetSite.ToString() + " " + ex.Source, ex.InnerException);
throw new Exception(ex.Message + " " + ex.StackTrace + " " + ex.TargetSite.ToString() + " " + ex.Source, ex.InnerException);
}
finally
{
// Clear the Provider object.
if ((provider != null))
{
provider.Clear();
}
}
if (Method == CryptMethod.Encrypt)
{
// Return the encrypted bytes from the memory stream.
return System.Convert.ToBase64String(msCrypt.ToArray());
}
else
{
// Return the unencrypted text
return retval;
}
}
#endregion
#region "Private Utility Functions"
private static byte[] DerivePassword(string Password, int Length)
{
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(Password, CRYPT_SALT, 5);
return derivedBytes.GetBytes(Length);
}
#endregion
}
要运行它,您可以执行以下操作
var decryptedstring = EncryptionExtension.CryptString(EncryptionExtension.CryptMethod.Decrypt, EncryptionExtension.EncryptionAlgorithms.Rijndael, "[Encrypted String]", "[key]");
更新:我已经添加了完整的类(class)。抱歉,我没有看到被屏蔽的部分
更新 2:我将 PaddingMode 更改为无。我不再看到错误。但是现在返回值是:��s)����j��U��#V��İ��H?X�
更新 3:在 4.5 上调试代码时,我有: - PKCS7 中的填充 - BlockSize = 256 对比 Core 中的 128我尝试了Jimi的代码,但得到了奇怪的字符:我尝试使用以下内容对其进行修改:Convert.ToBase64String(DecodedText);我没有出现奇怪的字符,但没有达到我预期的结果。
预期结果:
key :DNACTSACEENGINE
字符串: IdIFR+PP5yDggqgSlB0KfcNTG+DkRuRbPfeljJeGm+c=
结果: !vbqZgZKbu4?8
更新.Net Core 不支持 256 的 block 大小
提前致谢。感谢任何帮助
最佳答案
我已经修复了没有产生一致结果的部分。
但是,由于 Encryption 方法在您的代码中被注释掉了,我不确定 Encrypted 输入值是否正是此处显示的值,或者它来自不同的来源和/或不同的加密方法。
我已经将加密和解密方法使用的 MemoryStream
赋值字节数组与原始值的 Unicode
编码/解码集成在一起。
当然可以使用另一种编码。 (还使用 UTF8
进行了测试,这应该是默认设置)。
该字符串照常进行 Base64Encoded/Decoded。
我在这里发布的只是包含在 #region "String Encryption"
block 中的代码部分。
其余代码保持不变。
测试于:Visual Studio pro 15.8.0
.Net FrameWork:核心 2.1
C# 6.0 和 C# 7.3
加密/解密方法是这样调用的:
string encryptedstring = EncryptionExtension.CryptString(
EncryptionExtension.CryptMethod.Encrypt, EncryptionExtension.EncryptionAlgorithms.Rijndael,
"Some text to encrypt, more text to encrypt", "SomeKey");
string decryptedstring = EncryptionExtension.CryptString(
EncryptionExtension.CryptMethod.Decrypt, EncryptionExtension.EncryptionAlgorithms.Rijndael,
encryptedstring, "SomeKey");
#region "String Encryption"
public static string EncryptString(EncryptionAlgorithms Method, string Value, string Key)
{
return CryptString(CryptMethod.Encrypt, Method, Value, Key);
}
public static string DecryptString(EncryptionAlgorithms Method, string Value, string Key)
{
return CryptString(CryptMethod.Decrypt, Method, Value, Key);
}
public static string CryptString(CryptMethod Method, EncryptionAlgorithms Algorithm, string Value, string Key)
{
if (Value == null || Value.Length <= 0)
{
throw new ArgumentNullException("Data can not be empty");
}
if (Key == null || Key.Length <= 0)
{
throw new ArgumentNullException("Key can not be empty");
}
SymmetricAlgorithm provider = null;
try
{
switch (Algorithm)
{
case EncryptionAlgorithms.Rijndael:
provider = new RijndaelManaged();
break;
}
provider.KeySize = provider.LegalKeySizes[0].MaxSize;
provider.BlockSize = provider.LegalBlockSizes[0].MaxSize;
provider.Key = DerivePassword(Key, provider.LegalKeySizes[0].MaxSize / 8);
switch (provider.BlockSize / 8)
{
case 8:
provider.IV = IV_8;
break;
case 16:
provider.IV = IV_16;
break;
case 24:
provider.IV = IV_24;
break;
case 32:
provider.IV = IV_32;
break;
}
if (Method == CryptMethod.Encrypt)
{
byte[] encodedText = Encoding.Unicode.GetBytes(Value);
// Create the streams used for encryption/decryption
using (ICryptoTransform encryptor = provider.CreateEncryptor(provider.Key, provider.IV))
using (var msCrypt = new MemoryStream())
using (var csEncrypt = new CryptoStream(msCrypt, encryptor, CryptoStreamMode.Write))
{
csEncrypt.Write(encodedText, 0, encodedText.Length);
csEncrypt.FlushFinalBlock();
return Convert.ToBase64String(msCrypt.ToArray());
}
}
else
{
byte[] cipherBytes = Convert.FromBase64String(Value);
// Create the streams used for decryption.
using (ICryptoTransform decryptor = provider.CreateDecryptor(provider.Key, provider.IV))
using (var msCrypt = new MemoryStream(cipherBytes))
using (var csDecrypt = new CryptoStream(msCrypt, decryptor, CryptoStreamMode.Read))
{
byte[] decodedText = new byte[cipherBytes.Length];
int decryptedCount = csDecrypt.Read(decodedText, 0, decodedText.Length);
return Encoding.Unicode.GetString(decodedText, 0, decryptedCount);
}
}
}
catch (Exception ex)
{
//throw new AceExplorerException(ex.Message + " " + ex.StackTrace + " " + ex.TargetSite.ToString() + " " + ex.Source, ex.InnerException);
throw new Exception(ex.Message + " " + ex.StackTrace + " " + ex.TargetSite.ToString() + " " + ex.Source, ex.InnerException);
}
finally
{
// Clear the Provider object.
provider?.Clear();
}
}
#endregion
private static byte[] DerivePassword(string password, int length)
{
Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, CRYPT_SALT, 1000);
return derivedBytes.GetBytes(length);
}
关于c# - 指定的填充模式对此算法无效 - .net Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885572/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!