如何将bouncycastle算法添加到android

Vam*_*msi 6 encryption android bouncycastle

我正在尝试使用bouncycastle算法编写一个小应用程序,来自BouncyCastleProvider.java它说我们必须在运行时通过以下代码导入和添加提供程序

import org.bouncycastle.jce.provider.BouncyCastleProvider; Security.addProvider(new BouncyCastleProvider());

错误 - 无法解析导入org.bouncycastle; 导入错误期间 - BouncyCastleProvider无法解析为某种类型; 在调用addProvider时

我虽然bouncycastle没有提供Android 1.6 SDK,所以想到单独安装.我该怎么办?如果Bouncycastle与SDK一起发货,我该怎么做才能避免这些错误?我在winXP上使用Android 1.6,eclipse-V3.4.0.提前致谢

sat*_*ine 16

这些答案在 2021 年甚至几年前都不准确。

使用 Spongy Castle 或使用不同的包命名空间重新编译 Bouncy Castle 都不是必需的,因为 Android 平台上的包名称冲突已在 Honeycomb 中解决(除非您仍然支持 pre-honeycomb 设备)。详细原因请参见:https : //github.com/rtyley/spongycastle/issues/34

正确的解决方案是在您的 Android 应用程序中包含标准的 Bouncy Castle 库,如下所示。

第一步是在您的 gradle 文件中包含必要的库。您可以从 maven 获得标准的 Bouncy Castle,无需下载 JAR 并将其签入到您的项目中。

使用 gradle 构建时,将以下内容添加到dependenciesgradle 项目文件中的部分:

// See https://www.bouncycastle.org/releasenotes.html for latest revision
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.68'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.68'
Run Code Online (Sandbox Code Playgroud)

根据您的需要,您可能不需要从正式发布的 Bouncy Castle 中实际添加 Java 安全提供程序。如果您只想直接使用 Bouncy Castle 类,现在可以这样做。例如,我可以编写此代码来构建 X500Name 对象,而无需安装安全提供程序:

X500NameBuilder nameBuilder = new X500NameBuilder();
nameBuilder.addRDN(BCStyle.PSEUDONYM, "xyz");
nameBuilder.addRDN(BCStyle.E, "e@example.com");
X500Name name = nameBuilder.build();
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您想编写通过安全提供程序利用 Bouncy Castle 的代码,那么您应该首先将内置的 Android Bouncy Castle 安全提供程序替换为标准安全提供程序,因为 Java 不允许两个具有相同名称的安全提供程序. 这应该在应用程序启动期间尽早完成:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class MyApplication extends Application {
    static {
        Security.removeProvider("BC");
        // Confirm that positioning this provider at the end works for your needs!
        Security.addProvider(new BouncyCastleProvider());
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Java 安全提供程序严重依赖反射。如果您正在使用混淆或缩小您的项目,那么 Bouncy Castle 类将最终被不恰当地剔除或重命名,以防止您需要添加以下或类似的proguard.pro文件:

-keep class org.bouncycastle.jcajce.provider.** { *; }
-keep class org.bouncycastle.jce.provider.** { *; }
Run Code Online (Sandbox Code Playgroud)

最后,您可以编写将在后台使用标准 Bouncy Castle 安全提供程序的代码:

// MD2 hash is not secure, just demonstrating...
MessageDigest md = MessageDigest.getInstance("MD2");
byte[] messageDigest = md.digest(byteData);
Run Code Online (Sandbox Code Playgroud)

由于MD2不是由任何 Android 内置安全提供程序提供,因此只有在您如上所述添加 Bouncy Castle 安全提供程序时才能找到它。

  • 一种更干净/更安全的删除提供程序的方法,而不是使用“Security.removeProvider("BC");”,而是使用“Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);” (4认同)
  • 感谢您的详细撰写;这在 2021 年更有意义 (2认同)
  • @metamonkey Duplicate 类表示您的依赖树中某处已经有 Bouncy Castle。Bouncy Castle 以多种不同的方式打包(例如 jdk15to18 和 jdk15on),依赖管理工具不会理解这些是相同的库,因此它们将允许应用程序包含这两种方式。如果您使用 gradle,您可以运行依赖项命令来显示所有依赖项,并查看 Bouncy Castle 是否包含在多种形式中:https://docs.gradle.org/current/userguide/viewing_debugging_dependency.html (2认同)

Car*_*ley 8

或者更好的是仍然使用SpongyCastle,因为Android附带的BC既残废又旧.

  • 这仍然是真的吗?你能比"老"更具体吗?你能定义残废吗?您包含的SpongyCastle链接也没有解释. (6认同)

Adr*_*ian 5

您不需要明确地将BouncyCastle添加为提供者.正如你所说,它已经包含在Android中.

这是我为获得BouncyCastle AES密码所做的工作,

SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC");
Run Code Online (Sandbox Code Playgroud)

如果你查看BouncyCastleProvider.java,你会看到对PBEWithSHA256And256BitAES-CBC-BC的引用以及BouncyCastle提供的一些其他密码.

  • 它抛出异常 NoSuchAlgorithm (2认同)

Jim*_*ler 3

我对这个特定的图书馆不熟悉。不过,这里是有关如何将作为“jar”文件提供的库包含到 Android 项目中的一般说明。

下载 jar 文件并将其放在工作站上的某个位置。您可能想要将其放入要安装的项目的根目录中,或者可能放在根目录中的“lib”目录中。

在 Eclipse 中,选择 Project->Properties,然后选择 Java Build Path。然后单击“添加外部 Jars”,导航到放置 .jar 文件的位置,选择它并单击“打开”。

现在键入或粘贴一些尝试使用 jar 中的类的代码。如果幸运的话,左边空白处会出现一个灯泡图标。单击此按钮将提示您将正确的导入语句添加到 .java 文件的顶部。

此时仍然可能会出现问题。该库可能会使用 Android 未提供的 java.* 或 javax.* 内容(它只有这些库的子集)。它还可能有自己的附加库依赖项。还有其他原因导致 .jar 可能与 Android 平台不兼容。

另请注意,它会增加 .apk 的大小以容纳新内容。