gpt4 book ai didi

c# - 指定的填充模式对此算法无效 - .net Core

转载 作者:行者123 更新时间:2023-12-04 15:55:29 25 4
gpt4 key购买 nike

当我从 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com