所以我试图使用bouncycastle获取Blowfish的秘密密钥:
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"而不是" Blowfish"时也会发生这种情况,但它适用于" DES"和#34; AES")
答案 0 :(得分:0)
与具有内部结构的非对称密钥不同,您不需要“原始”秘密(对称)密钥的工厂,只需要使用派生算法(PBE *,PBKDF2等)的工厂。用于DES和DESEDE的标准(SunJCE)工厂会检查/修复长度和奇偶校验FWLIW,但BC(加上AES从1.56开始)甚至不会这样做。 RC4和Blowfish(以及其他)接受可变长度键而不对位进行约束,因此即使提供了 ,
只需将您的密钥材料放在SecretKeySpec
中即可使用。与其他*KeySpec
类型不同,SecretKeySpec
'是一个'{{1} (确切地说是SecretKey
那个接口)并且可以在需要implements
或适当SecretKey
的地方使用,特别是Key
如果你真的想要生成一个密钥,而不是使用/转换现有的密钥,那么你无论如何都不需要工厂。尽管名称,工厂只转换,他们不创建。要生成密钥,您需要Cipher.init(mode, key ...)
(或非对称KeyGenerator
)和BC中的RC4(又名ARC4)和BLOWFISH,以及标准SunJCE,但使用名称ARCFOUR和BLOWFISH ;或(对于原始对称)只需使用KeyPairGenerator
生成正确的字节数,然后使用它。