使用JDK 6中的SHA1和私钥进行加密

时间:2013-08-26 20:56:52

标签: java security encryption

我正在尝试使用JDK 1.6.0_35中的SHA1和私钥进行加密。

但我得到以下异常:

  

线程中的异常" main" java.security.NoSuchAlgorithmException:找不到任何支持SHA1的提供程序

相同的代码适用于AES。这是代码:

public class ExecuteEncryptDecryptSample {
        private static String method="SHA1"; 
        public static SecretKeySpec getKeySpec() throws IOException, NoSuchAlgorithmException {
            byte[] bytes = new byte[16];
            File f = new File("sample_aes_key");
        SecretKey key = null;
        SecretKeySpec spec = null;
        if (f.exists()) {
            new FileInputStream(f).read(bytes);
        } else {
            //KeyGenerator kgen = KeyGenerator.getInstance("SHA1");//PBKDF2WithHmacSHA1
            KeyGenerator kgen = KeyGenerator.getInstance(method);
            kgen.init(256);
            key = kgen.generateKey();
            bytes = key.getEncoded();
            new FileOutputStream(f).write(bytes);

        }
        spec = new SecretKeySpec(bytes,method);
        return spec;
    }
    public static void encrypt(String text) throws Exception {
        SecretKeySpec spec = getKeySpec();
        Cipher cipher = Cipher.getInstance(method);
        cipher.init(Cipher.ENCRYPT_MODE, spec);
        BASE64Encoder enc = new BASE64Encoder();
        System.out.println(enc.encode(cipher.doFinal(text.getBytes())));
    }

    public static void main(String[] args) throws Exception {
        String text = "1234000156237828282873773";
        //Security security;
        //security.getProviders();
        System.out.println();
        encrypt(text);
    }
}

在jdk 6中是否有SHA1的提供者??

任何帮助都将受到高度赞赏。

感谢。

3 个答案:

答案 0 :(得分:1)

SHA-1是一种安全散列算法。它不是一个关键的派生函数,即使它有时被用作一个。因此,虽然您可以将MessageDigest与算法"SHA-1"一起使用,但不能将KeyGenerator"SHA-1"一起使用。

如果要出于兼容性原因生成密钥,则可以将MessageDigest"SHA-1"一起使用,并获取输出的第一个字节(创建密钥所需的数量)。之后,您可以使用例如3DES密钥的SecretKeySpec(firstBytes, "AES")SecretKeyFactory

答案 1 :(得分:0)

如果要求您使用SHA1进行对称密钥加密,则这可能意味着 您应该使用对称密钥(例如AES)进行加密,并使用HMACSHA1进行身份验证。 用于身份验证的类将是

javax.crypto.Mac中

(不是MessageDigest),算法将是“HMACSHA1”而不是(“SHA1”)。 当然这是很多的猜测,不幸的是我今天没有我的水晶球,所以我可能是错的。 (例如,它也可能是对加密术语的滥用,意味着你应该使用SHA1并与RSA签名,当然使用SHA1将不再合适。)

答案 2 :(得分:-2)

尝试列出密钥库的所有条目,看起来AES在密钥存储区中不存在SHA。如果它不存在,请尝试将值添加到密钥库并再次测试。