使用 Android 实现 Bouncy Castle 密码算法

2024-04-26

我如何使用 Bouncy Castle 提供程序来实现 Serpent 和 Twofish 等算法,因为 Sun 的提供程序根本不实现这些。我知道当多个提供商可以实现相同的算法时,您可以从排名最高的提供商(即 Sun 提供商)获得实现。如果出于某种原因您想要使用特定提供程序的实现(可能是因为您知道它更快),您可以在 getInstance() 的两个参数版本中指定提供程序。就我而言,Sun 提供商根本没有实现我感兴趣的算法。

我尝试实现 Serpent:

    public static final String FILE_EXTENSION = ".serpent";
    public static final String PROVIDER = "BC"; // Bouncy Castle
    public static final String BLOCK_CIPHER = "Serpent";
    public static final String TRANSFORMATION = "Serpent/CBC/PKCS7Padding";
    public static final String KEY_ALGORITHM = "PBKDF2WithHmacSHA1";
    public static final String PRNG_ALGORITHM = "SHA1PRNG";

    public static final int BLOCK_SIZE = 128; // bits
    public static final int KEY_SIZE = 256; // bits
    public static final int ITERATION_COUNT = 1024; // for PBE

    /** Performs the encryption of a file. */
    public void encrypt(String pathname, char[] password, byte[] salt) {
        // Use bouncy castle as our provider
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

        // Convert the file into a byte array
        byte[] plaintext = fileToBytes(new File(pathname));

        // Generate a 256-bit key
        SecretKey key = generateSecretKey(password,salt);

        // Generate a 128-bit secure random IV
        byte[] iv = generateIV();

        // Setup the cipher and perform the encryption
        Cipher cipher = null;
        byte[] ciphertext = null;
        try {
            cipher = Cipher.getInstance(TRANSFORMATION, PROVIDER);
            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
            ciphertext = cipher.doFinal(plaintext);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Append the IV to the ciphertext
        byte[] temp = new byte[iv.length+ciphertext.length];
        System.arraycopy(iv, 0, temp, 0, iv.length);
        System.arraycopy(ciphertext, 0, temp, iv.length, ciphertext.length);
        ciphertext = temp;

        // Store the encrypted file in the same directory we found it
        if (Environment.getExternalStorageDirectory().canWrite()) {
            bytesToFile(ciphertext, pathname+FILE_EXTENSION);
            File file = new File(pathname);
            file.delete();
        }       
    }

然而,这会引发

java.security.NoSuchAlgorithmException: 蛇/CBC/PKCS7Padding

在我拨打的线路上

密码= Cipher.getInstance(转换, 提供商);

Running

$ adb shell
# logcat

我得到了很多

not resolving ambiguous class
not verifying
multiple definitions

输出错误。知道什么可能导致这种情况发生以及如何解决该问题吗?


你可能想要海绵城堡 https://github.com/rtyley/spongycastle#readme- 我用 Bouncy Castle 专门针对 Android 进行的重新打包。

Spongy Castle 完全替代了 Android 附带的 Bouncy Castle 加密库的残缺版本。要使其在 Android 上运行,需要进行一些小更改:

  • 所有包名称已从 org.bouncycastle.* 移至 org.spongycastle.* - 因此没有类加载器冲突
  • Java 安全 API 提供程序名称现在为SC而不是BC

“海绵城堡救了我的命。” - 来自一位快乐用户的反馈:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Android 实现 Bouncy Castle 密码算法 的相关文章

  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 如何在android中的谷歌地图上聚焦标记

    我只是想知道我们是否可以关注 Android 应用程序中添加的标记 如果是 怎么办 或者有没有其他方法可以完成这项任务 可以说我使用下面的代码添加了一个标记 map addMarker new MarkerOptions title tit
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 如何在Android模拟器中隐藏应用程序图标?

    我有一个应用程序在启动完成后自动启动 但应用程序图标显示在android模拟器中 现在我想向用户隐藏该图标 这样用户就无法知道应用程序已启动 并且他们无法启动该应用程序手动申请 在您的 AndroidManifest xml 文件中 您可能
  • Android - 状态栏阻止全屏

    我的应用程序启动时可以全屏正确运行 然而 在最小化然后返回应用程序后 状态栏会弹出 并将我的视图向下推一点 如何防止状态栏移动我的视图 这是我的布局
  • 双屏 Android Studio 中不显示自动补全

    我刚刚从 Eclipse 切换到 Android Studio IntelliJ 我不明白自动补全是如何工作的 我尝试了 Control Space Control Shift Space 但没有相关建议 不在 Java 文件中 也不在布局
  • Android Google Map V2:如何在单击另一个标记时更改先前单击的标记的图标

    更新 我通过添加 previousMarker 对象解决了性能问题 因此 只有先前单击的标记将被删除并替换为默认图标 但是 当我单击标记时 信息窗口仍然不显示 我有一个地图视图并在上面设置了一些标记 我想要的是 当我单击一个标记时 它将其图
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • Android 的 Intent 和 Parcelable 对象

    为什么我需要打包我的对象 即使我只需将其发送到同一任务的另一个线程 实际上 我需要打开一个甚至可以在同一线程 主线程 上运行的活动 换句话说 为什么 Google 不提供一个 startActivity 版本 它采用通用对象广告参数而不是捆
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • 带 getClassLoader 和不带 getClassLoader 的 getResourceAsStream 有什么区别?

    我想知道以下两者之间的区别 MyClass class getClassLoader getResourceAsStream path to my properties and MyClass class getResourceAsStre
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某

随机推荐

  • 如何在 Vaadin 7 表中实现滚动监听器

    在 Vaadin 中 当您在表格中向下或向上滚动时 com vaadin ui Table 不会触发任何事件来告诉您用户正在滚动 为什么我们需要在表格中滚动事件 我们先来看看 Vaadin 这个例子 仪表板演示 http demo vaad
  • 扩展会员提供者

    设想 构建一个供公司输入信息的应用程序 我需要扩展 ASP NET 中的内置成员资格提供程序 我的独特情况是 我已经拥有每家公司的人口统计信息 但没有网络应用程序的用户 ID 和密码 我想用人口统计信息预先填充数据库 向每个公司发送一个唯一
  • 使用另一个表中的唯一值创建一个表

    我正在使用 MS SQL Server Management Studio 我有桌子 Num ID Alpha ID 1 A 1 B 1 C 2 B 2 C 3 A 4 C 5 A 5 B 我想创建另一个包含该表中 2 列的表 以便 col
  • Angular 6 HttpClient - CORS 问题

    我的 Nodejs Restful 服务有以下端点http localhost 3000 api countries http localhost 3000 api countries 我正在使用这个中间件https github com
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • B2C认证不返回access_token

    我正在尝试使用 PKCE 一个有角度的项目来实现授权代码流 我正在使用 angular auth oidc client 我们已经有一个基于 IdentityServer4 的现有内部实施 客户端可以很好地配合该实施 但我们现在正在尝试将身
  • 您的应用程序正在使用具有不安全的 openFile 实现的内容提供程序

    在 Playstore 上发布我的应用程序后 我收到了这封电子邮件 您好 Google Play 开发者 我们审查了包名为 com example myappname 的 MyAppName 发现您的应用使用的软件包含用户安全漏洞 具有这些
  • 相机 API:跨设备问题

    我正在开发一个相机应用程序 基本上作为消息传递应用程序的一部分来附加图像等 该应用程序需要适用于 gt SDK 2 2 并且 I can t尽可能多地使用默认的 Android 相机 因为 该应用程序的性质决定了图像不应保存到磁盘上 一些
  • 如何测量 Hotspot 元空间中的碎片?

    我正在研究调试应用程序中的 OutOfMemoryError Metaspace 错误 在 OOME 之前 我在 gc 日志中看到以下内容 Heap before GC invocations 6104 full 39 par new ge
  • Django 使用 update() 模拟模型上的存储抛出错误

    我有一个小项目 正在进行一些测试 最近我问了一个问题 django test mocked imagefield 防止 上传 或 测试后清理 https stackoverflow com questions 42266305 django
  • 当 python 添加小整数时,幕后会发生什么? [复制]

    这个问题在这里已经有答案了 我正在摆弄id最近意识到 c Python 做了一些非常明智的事情 它确保小整数始终具有相同的值id gt gt gt a b c d e 1 2 3 4 5 gt gt gt f g h i j 1 2 3 4
  • 如何在 git tag 消息中包含换行符

    当我在 git 中标记版本化代码时 我喜欢在标记消息中使用项目符号点 这可以通过带注释的标签轻松完成 git tag a v1 0 0 Change number 1 Change number 2 Write a tag message
  • 媒体播放器准备时的进度条

    我试图弄清楚如何在我的媒体播放器准备流文件时显示 正在加载 请稍候 的进度条 现在发生的事情是在歌曲准备好后显示 我怎样才能解决这个问题 mediaPlayerLoadingBar ProgressDialog show PlaylistA
  • Java更改系统换行符

    在 Windows 上 使用System out println 打印出来 n r而在 Unix 系统上你会得到 n 有没有办法告诉java你想使用什么换行符 正如其他人已经说过的 系统属性line separator包含实际的行分隔符 奇
  • 什么是 IOS Safari 最大网页宽度限制(显示错误 --> 重复出现问题)

    2022 年 在最新的 ios 上 iOS Safari 在我的网站主页上崩溃 我无法弄清楚确切的问题 我的主页目前是一个仅限桌面的网站 在 Android 和 Windows 上加载快速且良好 但在 ios 14 15 中显示错误 重复出
  • 在 Python 中如何确定 IP 地址是否私有?

    在 Python 中 确定 IP 地址 例如 127 0 0 1 or 10 98 76 6 是在专用网络 http en wikipedia org wiki Private network 代码听起来并不难写 但可能存在比立即显而易见的
  • 在 Typescript 中获取泛型类型参数的名称

    是否可以在打字稿中获取泛型类型参数的名称 有这个方法 getName
  • 更新或删除的行值要么不会使该行唯一,要么会更改多行

    我想删除行 但收到 此错误 更新或删除的行值不会使该行唯一 或者 他们改变多行 您的表中有重复的行 在这种情况下 您无法使用 UI 编辑表 首先使用 SQL 删除具有匹配数据的行 然后尝试进行编辑 逐一删除具有匹配数据的行 直到只剩下一行
  • 在作曲家中,我必须在 require 之前使用 init 吗?

    我对命令有点困惑composer init and composer require 如果我是对的 如果我想从 packagist 添加一个库到我的项目中 我需要使用require 如果我想将我的库发布到 packagist 我需要使用in
  • 使用 Android 实现 Bouncy Castle 密码算法

    我如何使用 Bouncy Castle 提供程序来实现 Serpent 和 Twofish 等算法 因为 Sun 的提供程序根本不实现这些 我知道当多个提供商可以实现相同的算法时 您可以从排名最高的提供商 即 Sun 提供商 获得实现 如果