有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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) 个答案

  1. # 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生成正确的字节数,然后使用它