我在考虑使用RSA加密算法创建哈希函数(例如md5或sha1)。我想知道是否有任何明显的原因导致此算法不起作用:
- 生成RSA公钥/私钥。
- 丢弃私钥,根本不存储它。
- 以RSA加密块大小为长度开始哈希。
- 使用公钥对消息进行加密,逐块进行。
- 对于消息的每个加密块,使用指定算法(可能是+、xor等的组合)将其累加到哈希中。
要验证消息与存储的哈希相同,请使用保存的公钥并重复上述过程。
这种方法可行吗?安全吗?实用吗?
感谢任何意见。
我在考虑使用RSA加密算法创建哈希函数(例如md5或sha1)。我想知道是否有任何明显的原因导致此算法不起作用:
要验证消息与存储的哈希相同,请使用保存的公钥并重复上述过程。
这种方法可行吗?安全吗?实用吗?
感谢任何意见。
RSA加密是不确定性的:如果您遵循RSA标准,您将看到一些随机字节被注入。因此,如果您使用RSA加密相同的消息两次,很有可能您不会得到两次相同的输出。
另外,您的“未指定步骤5”可能会很薄弱。例如,如果您定义了一种方法来哈希一个块,然后只是对块进行XOR运算,则对于块大小的值A和B,A||B和B||A将哈希到相同的值;这将导致冲突激增。
从学术上讲,利用数论结构(即不是原始的RSA,而是重复使用相同类型的数学元素)构建哈希函数已经尝试过;有关详细信息,请参见Lars Knudsen的这个演示文稿。同样,ECOH哈希函数在SHA-3竞赛中提交,其核心使用椭圆曲线(但已被“破解”)。基本的期望是,哈希函数安全性可能与底层数论难题有所关联,从而提供可证明的安全性。然而,在实践中,这样的哈希函数要么速度慢,要么薄弱,要么两者都有。
如上所述,步骤4)应该是确定性的,即仅使用模数和公钥指数进行操作。 如果步骤3)中的哈希是私有的,则我认为这个概念是安全的。
关于第5步:在已知的内核算法CBC模式中,与先前结果的混合是在加密之前完成的,步骤4)可能更好地避免了勾结,例如使用懒惰哈希;异或是可以的。
将应用此方法,因为已知哈希函数的可用实现可能存在后门 :)
确定性Java RSA在这里。
编辑 还应该提到,RSA是可扩展的,没有任何限制。这样的哈希函数可以立即用作掩码生成函数。
不要过于思考,看起来这样做应该是具有密码学安全性的。
然而,你必须小心所选明文攻击,并且如果输入较大,则可能会遇到速度问题(因为非对称加密比密码哈希慢得多)。
因此,简而言之:是的,这似乎是可能且安全的... 但除非有一个非常强有力的理由,否则我会使用标准的HMAC,如果你想要一个带密钥的哈希。