junit java.security.NoSuchAlgorithmException:找不到任何支持的提供者

时间:2014-12-02 22:41:13

标签: java eclipse encryption

我正在使用JUnit 4 [C:\ eclipse \ plugins \ org.junit_4.11.0.v201303080030 \ junit.jar]与Eclipse结合使用(MARS,版本:Mars Milestone 3(4.5.0M3)Build id :20141113-0320。

我有一些测试可以测试一个简单的类,哪些测试运行良好。但现在到了我想测试我的加密类的地步,它实现了以下加密功能:

public String encrypt(String data) {

    try {

        SecretKeySpec KS = new SecretKeySpec(mKeyData, "Blowfish");

        Cipher cipher = Cipher.getInstance("Blowfish/CBC/ZeroBytePadding"); // PKCS5Padding
        cipher.init(Cipher.ENCRYPT_MODE, KS, new IvParameterSpec(mIv));
        return bytesToHex(cipher.doFinal(data.getBytes()));       

    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }
    return null;
}

Crypto类不属于分类......

public class Crypto {

为了测试这个类以及更多的加密函数,我设计了以下单元测试:

package my.junit4.example;

import static org.junit.Assert.*;

import org.junit.Test;

public class CryptoTest {

    @Test
    public void testEncryption() {

        Crypto myCrypto = new Crypto();

        String encodedString = myCrypto.encrypt("Secret");

        assertTrue("The decrypted encrypted word should deliver the original string", encodedString.equals(myCrypto.decrypt(encodedString)));
    }
}

此测试失败并显示堆栈跟踪:

java.security.NoSuchAlgorithmException: Cannot find any provider supporting Blowfish/CBC/ZeroBytePaddingnull
at javax.crypto.Cipher.getInstance(Cipher.java:535)     at
my.junit.example.encrypt(Crypto.java:35)    at
my.junit.example.CryptoTest.testEncrypt(CryptoTest.java:14)     at

这对我来说没什么意义。但对JUnit来说相对较新我怀疑问题在于我不了解如何制定这些测试。代码运行良好加密 - 我的调试器中的解密给了我想要的结果。但是我如何才能使用JUnit。我犯了什么明显的错误?

2 个答案:

答案 0 :(得分:2)

您需要将Bouncy Castle提供程序添加到Java运行时。您可以通过查看Bouncy Castle wiki page了解如何安装提供程序。 Java安装不支持Blowfish算法和零填充。

我的包装箱上运行正常:

Security.addProvider(new BouncyCastleProvider());

byte[] mKeyData = new byte[16];
byte[] mIv = new byte[8];

SecretKeySpec KS = new SecretKeySpec(mKeyData, "Blowfish");

Cipher cipher = Cipher.getInstance("Blowfish/CBC/ZeroBytePadding");
cipher.init(Cipher.ENCRYPT_MODE, KS, new IvParameterSpec(mIv));

确保运行时测试框架也可以使用提供程序。在安装提供程序之前,您需要将bcprov-jdk15on-[version].jar放在运行时的类路径中。

答案 1 :(得分:1)

问题在于这一行:

Cipher cipher = Cipher.getInstance("Blowfish/CBC/ZeroBytePadding");

您的系统不支持您请求的算法。您想要特定原因的任何特殊原因吗?

The docs指定以下默认实现:

  • AES / CBC / NoPadding(128)
  • AES / CBC / PKCS5Padding(128)
  • AES / ECB / NoPadding(128)
  • AES / ECB / PKCS5Padding(128)
  • DES / CBC / NoPadding(56)
  • DES / CBC / PKCS5Padding(56)
  • DES / ECB / NoPadding(56)
  • DES / ECB / PKCS5Padding(56)
  • DESede / CBC / NoPadding(168)
  • DESede / CBC / PKCS5Padding(168)
  • DESede / ECB / NoPadding(168)
  • DESede / ECB / PKCS5Padding(168)
  • RSA / ECB / PKCS1Padding(1024,2048)
  • RSA / ECB / OAEPWithSHA-1AndMGF1Padding(1024,2048)
  • RSA / ECB / OAEPWithSHA-256AndMGF1Padding(1024,2048)