2011-12-25 89 views
5
cipher = Cipher.getInstance("Blowfish"); 

这引发一个异常java.security.NoSuchAlgorithmException:Cipher Blowfish实现未找到。在android中的Blowfish加密

我检查了local_policy.jar和US_export_policy.jar都存在,并且它们从java安装的那一刻起没有改变。什么会导致这个问题?

编辑:

Object[] o = Security.getAlgorithms("Cipher").toArray(); 
    for (int i=0; i<o.length; i++) { 
     System.out.println((String)o[i]); 
    } 

当我运行这段代码,我得到列表,而“河豚”,但算法的名称,如DES或RSA中也有一些不知名的名称,如“1.2.840.113549.1.1.7”和那样。为什么没有Blowfish或者它隐藏在这些数字中?

回答

2

叶氏,我无法找到解决办法,只是使用的GNU密码库。它工作正常。

2

cipher = Cipher.getInstance("Blowfish")

只有Android 2.3及以上的作品,所以它可能是你的目标是下方的Android 2.3?

编辑:如果你想建立,2.3假设4.0 ICS同时也支持较低的设备,你可以添加这样的事情您的Manifest.xml:

<uses-sdk android:minSdkVersion="3" /> 
<uses-sdk android:targetSdkVersion="14" /> 

唯一的问题是你必须提供Blowfish作为一个选项,对于2.3以下的任何人来说,这将不是一个加密方法的有效选择(不可点击/灰色),我假设。测试它!构建它,并在各种SDK版本上尝试。祝你好运!

+0

我使用Android 2.1,那么我如何在Android 2.1中使用Blowfish? – Sergey 2011-12-25 12:32:38

+0

不幸的是,你不能。但是,您可以始终以2.3为目标,但允许使用较低版本的SDK。我将在上面的编辑中发布代码作为解决方案。 – TryTryAgain 2011-12-25 12:33:56

+0

这就是问题所在,我需要2.1平台 – Sergey 2011-12-25 12:51:42

2

如果您需要完整的平台支持,我可以建议的唯一解决方案是使用外部软件包。

Android自带了BouncyCastle的剥离版本。我相信随着版本的进步,会增加额外的功能。

但是,将完整的BouncyCastle jar导入到android会导致很多问题,因为Android版本使用相同的名称。

我用过的解决方案是使用SpongyCastle。我之前已经使用过它,但没有查看源代码以确保没有进行任何更改。

指导安装: How to include the Spongy Castle JAR in Android?

2

local_policy.jar和的US_export_policy.jar不与Android相关。您需要在Android上运行算法列表代码以获得有意义的结果。正如其他人所指出的,Android JCE提供程序基于Bouncy Castle,但不包含所有算法。您需要将完整的lib绑定到应用程序中才能使用所有算法。请使用Spongy Castle来简化操作。在此之后,你只需要改变的是指定供应商为“SC”:

Cipher c = Cipher.getInstance("Blowfish", "SC"); 
0

我在我的android应用程序中使用了blowfish加密。我不知道为什么,但blowfish加密已经在android上的弹性城堡库中被注释掉了。

我不得不下载弹性城堡资源,我将提供者名称从BC更改为BC2,并将软件包名称更名为bouncycastle2,以避免与已在android sdk上的软件包发生冲突。然后,我将这个自定义Bouncy Castle jar添加到我的应用程序中,作为一个新的jar,它工作正常!