通过 X509Certificate2 快速检查加密值

Fast checking for encrypted values by X509Certificate2

我在一个集合中有许多个不同的字符串值。

某些值已由 X509Certificate2 加密。所有其他值都是数字、非加密字符串、日期等。

我的目标是过滤可能的解密候选人。所以我想使用一个可以实现第一次快速过滤加密值的函数。

我使用这个简单的检查:

private bool IsEncryptedValue(string value)
{
    var result = !string.IsNullOrEmpty(value) && IsBase64String(value);
    return result;
}

请告知更正确(更强大)的加密值检查规则。

感谢您的任何建议。

任何现代密码的密文都是二进制的。如果密文是一个字符串,我希望它是使用 base 64(或方言)或十六进制编码的。解码后,如果使用直接 RSA 加密,它应该正好是密钥大小。如果使用了混合密码系统,那么它应该 至少 密钥大小。

当然,你必须找出使用的是哪种RSA加密方案,如果是混合加密,你还必须找出使用的是哪种对称加密方案。可能是加密使用了已知的容器格式,例如 CMS 或 PGP,因此您也可以对其进行扫描。

最后,尽管不太可能:原则上 RSA 加密的结果是一个数字。如果该数字以小数形式存储,那么它应该有 keysize / 3.32192809 或更少的数字。


原则上,密码的结果是随机的,因此我们没有太多可以将它与任何其他编码区分开来。您可以尝试验证它是随机的,但是如果您只有一个小的密文,那么估计随机性的数量就相对棘手了 - 所以我没有在我的答案中包含它。

尽管这是一项奇怪的尝试,但通常您会知道某些内容是否是密文。