c# - 通过 X509Certificate2 快速检查加密的 values

我在集合中有许多不同的字符串 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 或更少的数字。

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

不过,这是一项奇怪的尝试,通常您会知道某事是否是密文。

相似文章

go - golang 如何从字符串中查找表情符号?

我想查找表情符号是否存在并替换为字符串(HTMLunicode)。(符文到字符串)例如,这是句子“我喜欢你哈哈哈😀你好。”这就是结果。“我喜欢你哈哈哈😀你好。”表情符号和表情符号位置是随机的。我将...