在Java中对字符串进行SHA1解密

时间:2013-02-15 12:12:47

标签: android encryption cryptography sha1

我发现这里的代码How to SHA1 hash a string in Android?使用SHA1对字符串进行加密,工作正常,

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA1Encryption {

    public static String SHA1(String text) throws NoSuchAlgorithmException,
            UnsupportedEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(text.getBytes("iso-8859-1"), 0, text.length());
        byte[] sha1hash = md.digest();
        return convertToHex(sha1hash);
    }

    private static String convertToHex(byte[] data) {
        StringBuilder buf = new StringBuilder();
        for (byte b : data) {
            int halfbyte = (b >>> 4) & 0x0F;
            int two_halfs = 0;
            do {
                buf.append((0 <= halfbyte) && (halfbyte <= 9) ? (char) ('0' + halfbyte)
                        : (char) ('a' + (halfbyte - 10)));
                halfbyte = b & 0x0F;
            } while (two_halfs++ < 1);
        }
        return buf.toString();
    }

}

但我需要将其解密回原始字符串。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

你基本上要问的是:“给定值y,找到x,使得h(x)= y。” 这被称为寻找前映像。 单向散列函数(其中SHA1就是一个例子)的全部意义在于,这不可能以比蛮力更快的方式进行(这将平均需要O(2 ^ 159)个动作)

进一步阅读: http://en.wikipedia.org/wiki/Cryptographic_hash_function http://en.wikipedia.org/wiki/One-way_compression_function

答案 1 :(得分:2)

你不能这样做。 SHA1是单向散列算法。你无法恢复原始内容。

如果您需要双向加密方案,请尝试使用AES(或RSA,但这可能是过度杀伤)。

答案 2 :(得分:0)

SHA1是一个哈希函数,所以你不能解密,因为它没有解密。看一下维基百科的加密哈希函数,它对哈希函数和常见加密hash functions有一些一般性的描述。

答案 3 :(得分:0)

您无法解密安全单向哈希算法生成的值。哈希与加密不同。

您可以做的是迭代所有可能的字符串值,为每个字符串值创建哈希值,并比较哈希值。如果您找到哈希值,则可以绝对确定您已找到原始字符串。您发现两个散列的字符串非常接近于零的可能性,您可以放心地假设它不会发生加密安全散列。

可能的字符串数量显然是无穷无尽的,因此如果您对字符串有其他了解,则只能迭代所有值。例如。如果您有一个4位数的密码,您可以使用该知识计算最多10,000个可能的哈希值。