.net RSA和OAEP:选择还是不选择哈希算法?

.net RSA和OAEP:选择还是不选择哈希算法?,.net,vb.net,encryption,cryptography,rsa,.net,Vb.net,Encryption,Cryptography,Rsa,我正在实施非对称加密系统: ''' <summary> ''' A facade for a data asymmetrical encryption algorithm relying on a pair of public and private keys. ''' </summary> Public Interface IAsymEncrypter ''' <summary> ''' The public key to rely upo

我正在实施非对称加密系统:

''' <summary>
''' A facade for a data asymmetrical encryption algorithm relying on a pair of public and private keys.
''' </summary>
Public Interface IAsymEncrypter

    ''' <summary>
    ''' The public key to rely upon for encrypting data. Under XML format.
    ''' </summary>
    ReadOnly Property PublicKeyXml As String

    ''' <summary>
    ''' The private key to rely upon for decrypting data. Under XML format.
    ''' <para>Also contains the public key.</para>
    ''' </summary>
    ReadOnly Property PrivateKeyXml As String

    ''' <summary>
    ''' Encrypts data, using a public key.
    ''' </summary>
    ''' <param name="Data">The data to encrypt.</param>
    Function Encrypt(Data As Byte()) As Byte()

    ''' <summary>
    ''' Decrypts data, using a private key.
    ''' </summary>
    ''' <param name="Cipher">The cipher to decrypt the data from.</param>
    Function Decrypt(Cipher As Byte()) As Byte()

End Interface
“”
''数据非对称加密算法的门面,该算法依赖于一对公钥和私钥。
''' 
公共接口IAsymEncrypter
''' 
''加密数据所依赖的公钥。在XML格式下。
''' 
只读属性PublicKeyXml作为字符串
''' 
''解密数据所依赖的私钥。在XML格式下。
''还包含公钥。
''' 
只读属性PrivateKeyXml作为字符串
''' 
''使用公钥加密数据。
''' 
''要加密的数据。
函数加密(数据为Byte())为Byte())
''' 
''使用私钥解密数据。
''' 
''解密数据的密码。
函数解密(密码为Byte())为Byte())
端接口

该实现包装了一个
rsacyptoserviceprovider
加密
解密
的实现需要选择填充。我已经研究并了解了以下内容:

  • OAEP填充应优先于PKCS
  • 到目前为止,与OAEP相关联的哈希算法在抗冲突方面的弱点并不值得关注,也不应成为决定性的标准
  • 依靠较短的输出哈希可以加密较大的字符串
我正在寻找最佳安全实践,同时尽可能降低维护成本。我已经看到
.Encrypt
有两种:

  • .Encrypt(数据为Byte(),fOAEP为Boolean)为Byte()
    ,其中
    fOAEP
    应设置为
    True
    以依赖于OAEP。我假设这意味着哈希算法是自动选择的;我没有弄清楚是基于什么标准的
  • .Encrypt(日期为Byte(),填充为RsaEncryptionPadding)为Byte()
    ,其中可以指定与SHA-1到SHA512关联的OAEP
两个问题:

  • 填充模式是否与加密邮件一起存储?也就是说,我可以从加密的消息中猜出使用哪种填充模式来解密它吗
  • 如果没有,那么我想我最好自己选择模式,在这种情况下,我想知道我是否应该考虑其他因素
  • 我假设这意味着哈希算法是自动选择的;我没有弄清楚是基于什么标准的

    不幸的是,旧的微软API的规格严重不足(或者说文档不足)。这不是唯一找不到算法或编码方法的地方。SHA-1是标准中的默认值,因此如果不指定它,则可能会使用它(同时也是为了向后兼容)


    Q1:填充模式是否与加密消息一起存储?也就是说,我可以从加密的消息中猜出使用哪种填充模式来解密它吗

    不,即使是,你也不应该用它。RSA PKCS#1指定您应该预先确定配置参数。除此之外,如果允许更改而不首先验证该选择,则会给攻击者带来一点好处


    问题2:如果没有,那么我想我最好自己选择模式,在这种情况下,我想知道是否还有其他考虑因素需要考虑

    SHA-1是标准中的默认值,可以使用SHA-256,因为它速度相对较快,并且没有任何攻击。它也在最新的CPU上加速。缺点:在没有这种加速的64位机器上,它仍然是最慢的哈希(但是,与RSA相比,它在实践中可能不会那么明显)。SHA-512速度非常快,安全性也非常好,尽管安全余量对于这个特定用途来说并不重要

    如果有遗留问题,我会选择SHA-1——在这种情况下,SHA-1必须严重受损才能引起关注。否则,SHA-256更有意义,因为它更安全


    请务必使用扩展方法,这样其他开发人员就不必像您现在这样挠头了。这里有很多问题,人们无法在不同的运行时复制算法。如果您清楚地指定了配置参数,那么就消除了很多不确定性

    微软并不是孤立的w.r.t.糟糕的API文档(尽管我必须说他们在这方面做得很出色)。我在很大程度上反对使用默认密码,如果您必须自己记录它,您还可以在代码中指定配置参数


    当我们讨论隐藏基本细节时,您是否害怕在Facade类中隐藏所有细节?通常,这类类类只是围绕Microsoft指定API的一个薄层,它们完全隐藏了您不想隐藏的细节。如果在多个项目中使用它们,那么如果您犯了任何错误,就几乎不可能更改它们

    通常,创建此类类只是为了包装开发人员的知识,而不是为了特定于应用程序的目的。出于练习的目的编写它们是可以的,但我不会在常规代码库中使用它们。相反,为特定用例编写类



    通常,如果您担心您的消息不适合单个RSA块,您会使用混合加密并加密随机AES密钥。其他运行时可能会使用原始RSA来实现RSA-KEM,但在Microsoft/.NET环境中,这可能不是一个好主意,因为您总是需要使用pad。

    RSACryptServiceProvider
    只支持OAEP-SHA1,因为Windows CAPI库只支持OAEP-SHA1。使用任何其他OAEP加密都会引发异常:我刚刚意识到!所以现在我在路上通过CNG来实现…谢谢Maarten!这个类的目的是通过(i)抽象安全考虑(facade不应该