java - junit java.security.NoSuchAlgorithmException : Cannot find any provider supporting 问题

标签 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 一起工作。我犯了什么明显的错误?

最佳答案

问题出在这一行:

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)

关于java - junit java.security.NoSuchAlgorithmException : Cannot find any provider supporting 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260435/

相关文章:

android - 基于文件的加密(FBE)和全盘加密(FDE)有什么区别

c# - 如何生成不寻常但数学上有效的 RSA key ?

java - Java中的输出文本移动了半个空格

java - 我可以在Hadoop上运行仅具有映射器类的Java源代码(没有Reducer类的源代码)吗?

java - 如何在java中使用jFileChooser的打开按钮?

java - SWT 如何打印scrolledComposite 的内容?

java - 定义动态单元格范围

java - 在 Android 项目中创建和使用自定义 JAR

java - oracle.jdbc.driver.OracleDriver ClassNotFoundException 异常

java - 如何解决javax.crypto.IllegalBlockSizeException : Data must not be longer than 256 bytes