如何在 JAVA 中使用 DatatypeConverter MD5 进行解密?

how to decrypt using DatatypeConverter MD5 In JAVA?

public static void main(String[] args) {
    String s = "text";  
    hash=DatatypeConverter.printHexBinary(MessageDigest.getInstance("MD5").digest(s.getBytes("UTF8")))
    System.err.println(hash);
}

你不能。这就是散列的意义所在。这不是 API 或库限制,而是设计上的数学限制。

你需要明白哈希和加密/解密是两个完全不同的东西(经常一起使用)。

散列

一个散列,或者更准确地说,a cryptographic hash, is the result of a mathematical one-way function,这意味着它是不可逆的。一旦对某些内容进行了哈希处理,就不可能从中获取经过哈希处理的文本。这至少对于良好的散列算法是正确的,它们不被认为是坏的。 MD5SHA1 被认为是损坏的,所以如果您在安全上下文中需要它,请使用 SHA-256 甚至 SHA-512 代替。如果你只需要这个作为校验和,MD5 应该没问题。 您可以只使用 MD5 哈希值并将其键入 Google 并取回结果。这不是您想要的哈希函数。例如。取你的散列值 1cb251ec0d568de6a929b520c4aed8d1,这是你的消息 text 的 MD5 散列值,你会得到一个 website,显示原始文本。

另一个 属性 的散列是,对于两个不同的输入,理想情况下它应该永远不会有相同的输出。这当然是不可能的,因为要散列的可能消息集比可能的散列消息集大得多,因为散列具有固定长度。但是应该不可能按照某种算法或巧妙的输入人为地生成这样的hash collision

找出散列的唯一方法是散列许多消息(brute-force) and see if the computed hash matches the hash to be cracked. See Rainbow tables 了解更多信息。

散列主要用于确保完整性,即未对通过网络发送的消息进行任何修改。它通常与加密算法结合使用(这可能是您混淆的根源),因为您需要的不仅仅是完整性来保证安全通信,即额外的身份验证(例如通过使用证书)和机密性(这由加密算法提供)。

加密

一个encryption function is a function which takes a message and a key and produces a result which is not readable unless you have the key. Side note: there may be one or two keys for encryption/ decryption depending on the algorithm you use (symmetric vs. asymmetric)。如果您有密钥,则可以通过应用解密功能将其还原。如果它是像散列这样的 one-way 函数,加密就没有意义,因为消息的接收者将无法检索消息。