我需要根据字符串创建私有\公钥。 (此字符串是在运行时生成的唯一特定于机器的ID。公钥将被共享,因此所有用户都可以将数据发送到此计算机。)
据我所知,RSACryptoServiceProvider会自动生成密钥对。每次发送相同的字符串时,我都需要生成相同的对。
知道如何在c#中实现它吗?
(添加) 我对创建证书并将其存储在本地不感兴趣,它不适合这种情况(因为如果你在计算机上的两个不同的os安装中生成一个证书,那么密钥对将是不同的。我需要特定于机器的ID我现在如何生成ID,但我现在还不确定如何基于它生成密钥。
我想使用RSA,但是,任何非对称算法都是合适的。
答案 0 :(得分:4)
您可以尝试以下方法:
使用Rfc2898DeriveBytes导出两个位串。将每个部分解释为一个BigInteger,然后找到它之后的下一个素数。这些是您的p,q,您可以从中构建用于RSA的e,d,n
但这可能是一个坏主意,因为我刚刚发明了它,而且它不是基于已建立的加密技术。
我宁愿在每台计算机上以正常方式生成私钥,并存储它。我认为Windows甚至提供了一种存储密钥的特殊方式。
答案 1 :(得分:2)
没有切实可行的方法。从理论上讲,您可以破解OpenSSL的RSA和RNG实现,并确保RSA密钥生成器接收的唯一熵是您的字符串。这样,无论运行多少次,keygen进程都会为每个输入字符串吐出一个且只有一个RSA密钥。但是,您的字符串几乎肯定没有足够的熵来使生成的密钥在加密方面有用。如果这对你来说还不够,还有一个问题就是这个过程高度依赖于RSA keygen进程的内部,这可能会在OpenSSL版本之间发生变化 - 这会导致根据相同的输入生成不同的密钥。 p>
为什么不能生成RSA密钥对并使用字符串加密私钥(使用对称算法),然后在本地存储加密的blob?这样,如果字符串(机器指纹?)没有改变,它可以解密之前存储的密钥,而不是每次启动应用程序时生成密钥。