gpt4 book ai didi

c# - 错误 : Specified key is not a valid size for this algorithm

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:54 31 4
gpt4 key购买 nike

我被一种加密方法困住了。我对加密或字节数组了解不多,所以我很难解决这个问题。

这是我的代码:

 public static class EncryptDecrypt {
private static byte[] key = { };
private static string sEncryptionKey = "B@|@j!";
private static byte[] IV = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab};

public static string Encrypt(string stringToEncrypt)
{
string returnstring = "";
try
{

key = System.Text.Encoding.UTF8.GetBytes(sEncryptionKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms,
des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();

returnstring = Convert.ToBase64String(ms.ToArray());

//URL Encryption Avoid Reserved Characters
returnstring = returnstring.Replace("/", "-2F-");
returnstring = returnstring.Replace("!", "-21-");
returnstring = returnstring.Replace("#", "-23-");
returnstring = returnstring.Replace("$", "-24-");
returnstring = returnstring.Replace("&", "-26-");
returnstring = returnstring.Replace("'", "-27-");
returnstring = returnstring.Replace("(", "-28-");
returnstring = returnstring.Replace(")", "-29-");
returnstring = returnstring.Replace("*", "-2A-");
returnstring = returnstring.Replace("+", "-2B-");
returnstring = returnstring.Replace(",", "-2C-");
returnstring = returnstring.Replace(":", "-3A-");
returnstring = returnstring.Replace(";", "-3B-");
returnstring = returnstring.Replace("=", "-3D-");
returnstring = returnstring.Replace("?", "-3F-");
returnstring = returnstring.Replace("@", "-40-");
returnstring = returnstring.Replace("[", "-5B-");
returnstring = returnstring.Replace("]", "-5D-");


return returnstring;
}
catch (Exception e)
{
return e.Message;
}
}
}

但每当我将字符串作为 string encrypt= EncryptDecrypt.Encrypt("abcd"); 传递时,它都会提供一个错误 Specified key is not a valid size for this algorithm。如何解决这个问题以及如何通过这种方法加密任何字符串(主要是 1-8 个字符)?

最佳答案

DES 算法需要 64 位(8 字节) key 。您的 sEncryptionKey 长度为 6 个字符,这就是您收到“指定的 key 不是有效大小”错误的原因。

DES 使用 64 位 key ,这些 key 不应该是像“SomePass”这样的人性化密码。它们应该是二进制 key ,涵盖 64 位 key 的所有可能变化(2^64 种不同的组合)。否则,您的加密将比 DES 标准暗示的要弱得多。

这就是为什么当使用 System.Security.Cryptography 中的对称加密算法时,您不应将您的 secret 视为将用于加密的最终 key ,而应将其视为生成加密 key 的密码短语。您通过使用您的密码和一些盐(可以随机生成,但也应该在解密过程中使用)构造 System.Security.Cryptography.Rfc2898DeriveBytes 实例来执行此生成。

您的代码的另一个问题是您使用的是 6 字节长度的初始化向量 (IV)。它也应该是 8 字节长度,并且您应该为每次加密使用随机初始化向量。您可以通过调用 DESCryptoServiceProvider.GenerateIV() 方法并访问 DESCryptoServiceProvider.IV 属性来生成 IV。

最后一点。由于您将 returnstring 转换为 Base64,因此无需替换所有这些特殊字符,例如“&”和“$”。 Base64字符集由数字、数字和'+'、'/'、'='符号组成。您只能替换这 3 个字符。

所以这里是根据以上评论编辑您的代码:

public static class EncryptDecrypt
{
private static string sEncryptionPassphrase = "B@|@j!";

public static string Encrypt(string stringToEncrypt)
{
try
{
string returnstring;
var salt = GenerateSalt();
using (var keyBytes = new Rfc2898DeriveBytes(sEncryptionPassphrase, salt))
{
var key = keyBytes.GetBytes(8);

DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.GenerateIV();
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, des.IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
returnstring = Convert.ToBase64String(ms.ToArray());
}

//URL Encryption Avoid Reserved Characters
returnstring = returnstring.Replace("/", "-2F-");
returnstring = returnstring.Replace("+", "-2B-");
returnstring = returnstring.Replace("=", "-3D-");

return returnstring;
}
catch (Exception e)
{
return e.Message;
}
}

private static byte[] GenerateSalt()
{
var randomBytes = new byte[8];
using (var rngCsp = new RNGCryptoServiceProvider())
{
rngCsp.GetBytes(randomBytes);
}
return randomBytes;
}
}

关于c# - 错误 : Specified key is not a valid size for this algorithm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47918051/

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