我在集合中有许多不同的字符串 values 。
一些 values 被 X509Certificate2
加密。所有其他 values 是数字、非加密字符串、dates 等。
我的目标是过滤可能的解密候选者。所以我想使用一个可以实现对加密的 values 进行第一次快速过滤的功能。
我使用这个简单的检查:
private bool IsEncryptedValue(string value)
{
var result = !string.IsNullOrEmpty(value) && IsBase64String(value);
return result;
}
请告知检查加密 value 的更正确(更强大)的规则。
感谢您的任何建议。
回答1
任何现代密码的密文都是二进制的。如果密文在一个字符串中,我希望它已经使用 base 64(或方言)或十六进制编码。解码后,如果使用了直接 RSA 加密,它应该正好是 key 大小。如果使用了混合密码系统,那么它至少应该是 key 大小。
当然,您必须找出使用了哪种 RSA 加密方案,在混合加密的情况下,您还必须找出使用了哪种对称加密方案。可能是加密使用了已知的容器格式,例如 CMS 或 PGP,因此您也可以对其进行扫描。
最后,虽然不太可能:原则上 RSA 加密的结果是一个数字。如果该数字以小数形式存储,则它应该具有 keysize / 3.32192809 或更少的数字。
原则上,密码的结果是随机的,因此我们没有太多可以将其与任何其他编码区分开来。您可以尝试验证它是否是随机的,但如果您只有一个小的密文,那么估计随机性的数量就比较棘手 - 所以我没有在我的答案中包含它。
不过,这是一项奇怪的尝试,通常您会知道某事是否是密文。