使用Blowfish生成secretKey时出现java问题
因此,我尝试使用bouncycastle获取河豚的秘钥,如下所示:
SecretKeyFactory factory =SecretKeyFactory.getInstance("Blowfish", "BC");
但它抛出以下异常:
Exception in thread "main" java.security.NoSuchAlgorithmException: no such algorithm: Blowfish for provider BC
at sun.security.jca.GetInstance.getService(GetInstance.java:87)
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:96)
at javax.crypto.SecretKeyFactory.getInstance(SecretKeyFactory.java:204)
at Main.main(Main.java:112)
我如何解决这个问题?(当我使用“RC4”而不是“河豚”时也会发生这种情况,但它与“DES”和“AES”一起使用)
# 1 楼答案
与具有内部结构的非对称密钥不同,“原始”秘密(对称)密钥实际上不需要工厂,只需要使用派生算法(PBE*、PBKDF2等)的密钥。DES和DESEDE的标准(SunJCE)工厂会检查/固定长度和奇偶校验FWLIW,但BC工厂(加上以1.56开头的AES)甚至不会这样做。RC4和Blowfish(除其他外)接受可变长度键,对位没有任何限制,因此,即使提供了,工厂也无法真正做到任何事情
只需将关键材料放在
SecretKeySpec
中并使用它即可与其他*KeySpec
类型不同,SecretKeySpec
是一个SecretKey
(确切地说implements
接口),可以在需要SecretKey
或适当的Key
的地方使用,特别是在Cipher.init(mode, key ...)
如果你真的想生成一个密钥,而不是使用/转换一个现有的密钥,你也不需要工厂。尽管名称不同,工厂只转换,不创造。要生成密钥,您需要一个
KeyGenerator
(或不对称的KeyPairGenerator
),这些密钥确实存在于BC中的RC4(也称为ARC4)和BLOWFISH中,也存在于标准SunJCE中,但使用名称ARCFOUR和BLOWFISH;或者(对于原始对称),只需使用SecureRandom
生成正确的字节数,然后使用它