AES 256位密钥生成符合特定校验和C#
我收到此验证代码,以证明AES密钥是否符合: Cypher.cs类AES 256位密钥生成符合特定校验和C#,c#,encryption,aes,C#,Encryption,Aes,我收到此验证代码,以证明AES密钥是否符合: Cypher.cs类 public bool ValidateCheckSumAESKey(string strAESKey) { string base64AESKey = strAESKey; const int N = 3; const string valSumCalc = "qx6p"; SHA256Managed h = new SHA256Managed();
public bool ValidateCheckSumAESKey(string strAESKey)
{
string base64AESKey = strAESKey;
const int N = 3;
const string valSumCalc = "qx6p";
SHA256Managed h = new SHA256Managed();
byte[] base64AESKeyBytes = System.Text.Encoding.ASCII.GetBytes(base64AESKey);
byte[] sha256hash = h.ComputeHash(base64AESKeyBytes);
byte[] sha256hashNbytes = new byte[N];
Array.Copy(sha256hash, 0, sha256hashNbytes, 0, sha256hashNbytes.Length);
string base64sha256hashNbytes = Convert.ToBase64String(sha256hashNbytes);
string result = base64sha256hashNbytes.Replace("=", "");
if (0 == string.Compare(result, valSumCalc))
{
return true;
}
else
{
return false;
}
}
因此,给定的示例键“cWhay3H4asTvRzXzXGZQ3KyBEu9BZaIxl8J+L4Bhr5A=”传递校验和
我正在尝试使用生成AES密钥
public string Encrypt()
{
AesManaged aes = new AesManaged();
aes.KeySize = 256;
return Convert.ToBase64String(aes.Key);
}
但即使我在主课上
Cypher cf = new Cypher();
bool boolValid = false;
while (!boolValid)
{
string strKey = cf.Encrypt();
boolValid = cf.ValidateCheckSumAESKey(strKey);
}
…它可以运行数小时而找不到一个有效密钥。如何缩短循环以更快地找到符合要求的密钥
提前感谢。4个base64字符代表24位信息,提供16777216种不同的组合 测量
Encrypt()
的速度可以很好地说明平均试用1600-1700万个案例需要多长时间
考虑在每次调用时生成一个新的随机键。。随机数据通常是系统上的有限资源,可能会降低您的速度。特别是尝试测量
new()的速度代码>4个base64字符代表24位信息,提供16777216种不同的组合
测量Encrypt()
的速度可以很好地说明平均试用1600-1700万个案例需要多长时间
考虑在每次调用时生成一个新的随机键。。随机数据通常是系统上的有限资源,可能会降低您的速度。特别是尝试测量new()的速度代码>不可否认,大幅截断SHA256输出应该会减少搜索空间,但最终,您仍在尝试对SHA256执行预映像攻击。它的计算成本应该很高。首先,这样做的安全优势是什么?我不知道优势是什么。这只是根据请求建立“有效”AES密钥的强制性规则。似乎是一个不知道什么是安全性的人任意强加的,或者是故意用已知密钥破坏加密的后门。任何256位的数字都是一个完全有效的AES密钥,它的随机性越强越好。很好地了解客户,我知道这是一种掌握代码的方法。但我对此无能为力。仍然运行了6个小时的验证,没有找到一个密钥。我开始考虑运行代码的几个星期,并用我发现的任何有效的结果来构建一个池……无可否认,极大地截断SHA 256的输出应该减少搜索空间,但是,在一天结束的时候,你仍然试图对SHA256进行预映像攻击。它的计算成本应该很高。首先,这样做的安全优势是什么?我不知道优势是什么。这只是根据请求建立“有效”AES密钥的强制性规则。似乎是一个不知道什么是安全性的人任意强加的,或者是故意用已知密钥破坏加密的后门。任何256位的数字都是一个完全有效的AES密钥,它的随机性越强越好。很好地了解客户,我知道这是一种掌握代码的方法。但我对此无能为力。仍然运行了6个小时的验证,没有找到一个密钥。我开始考虑运行代码的几个星期,并用我找到的任何有效的结果来构建一个池……100000个组合生成= EAPSESE= 00:15: 39.4728012。所以,要尝试所有这些,需要很长时间。。。我可能需要30-40把钥匙。想法?是钥匙的生成,还是利用时间的其他部分?如果是生成密钥,您可以“手动”生成密钥,而不是使用new AesManaged()
I measured Encrypt+Validate。在While循环中,我只是添加了一个秒表,让我在10万次尝试后获得时间(顺便说一句,没有一次成功)。你“手工”制作钥匙是什么意思?在你的代码中,你只使用AES来获取钥匙,其他什么都没有。如果这是需要时间的部分,您可以研究其他方法来生成密钥。但首先。。确定使用时间的内容。100000个组合生成=经过=00:15:39.4728012。所以,要尝试所有这些,需要很长时间。。。我可能需要30-40把钥匙。想法?是钥匙的生成,还是利用时间的其他部分?如果是生成密钥,您可以“手动”生成密钥,而不是使用new AesManaged()
I measured Encrypt+Validate。在While循环中,我只是添加了一个秒表,让我在10万次尝试后获得时间(顺便说一句,没有一次成功)。你“手工”制作钥匙是什么意思?在你的代码中,你只使用AES来获取钥匙,其他什么都没有。如果这是需要时间的部分,您可以研究其他方法来生成密钥。但首先。。确定时间的用途。