AES 256位密钥生成符合特定校验和C#

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();

我收到此验证代码,以证明AES密钥是否符合:

Cypher.cs类

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来获取钥匙,其他什么都没有。如果这是需要时间的部分,您可以研究其他方法来生成密钥。但首先。。确定时间的用途。