在 Android 中使用 AES/CBC/PKCS5Padding 解密不正确

2024-03-02

我在 Android (v2.2 API 8) 中编写了以下代码,其中输入纯文本,代码使用用户密码和随机盐对其进行加密,然后解密。运行代码后,我只得到部分正确的纯文本。例如用户输入“Msg 1.5 to encrypt”,解密结果为“Msg15toencrypg==”

这是代码:

 private EditText plain_msg;
    private EditText pwd;
    private TextView result;
    byte[] iv;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    plain_msg = (EditText)findViewById(R.id.msg2encypt);
    pwd = (EditText)findViewById(R.id.password);
    result = (TextView)findViewById(R.id.decrypttxt);
}

public void mybuttonHandler(View view){
    String S_plain_msg = plain_msg.getText().toString();
    String S_pwd = pwd.getText().toString();
    setAES(S_plain_msg, S_pwd);
}


private byte[] generateSalt() throws NoSuchAlgorithmException{
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] ransalt = new byte[20];
    random.nextBytes(ransalt);
    return ransalt;
}


private void setAES(String msg, String pwd){
    try {
        //Generation of Key
        byte[] salt = generateSalt();
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
        KeySpec spec = new PBEKeySpec(pwd.toCharArray(),salt,1024, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

        //Encryption process
        byte[] btxt = Base64.decode(msg, 0);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secret); 
        AlgorithmParameters params = cipher.getParameters(); 
        iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
        byte[] ciphertext = cipher.doFinal(btxt);
        String encryptedtext = Base64.encodeToString(ciphertext, 0);

        //Decryption process
        byte[] bencryptxt = Base64.decode(encryptedtext, 0);
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv)); 
        ciphertext = cipher.doFinal(bencryptxt);
        String cipherS = Base64.encodeToString(ciphertext, 0); 

        result.setText(cipherS);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    } 

}

}


如果去掉加密解密,这应该是身份转换,剩下的是:

Base64.encodeToString(Base64.decode(msg))

"Msg 1.5 to encrypt"不是 Base64 编码的字符串,无需尝试对其进行解码。如果您这样做,就像您所做的那样,非 Base64 字符会被剥离,并且您会得到一些字节,这些字节在编码回来时看起来就像您得到的结果。

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

在 Android 中使用 AES/CBC/PKCS5Padding 解密不正确 的相关文章

随机推荐

  • 如何在反应中保存文件输入值

    假设一个页面包含多阶段表单 在表单的第一阶段包含名称的输入字段 在第二阶段包含文件的输入 onChange设置名称和文件的状态值 但是当我们像第一阶段到第二阶段一样来回移动时阶段和第二阶段 我们可以保存输入类型名称的值 但如何保存输入类型文
  • 在Java中:如何让线程监视另一个线程?

    抱歉 如果问题很简单 我是初学者 我必须创建计算某些内容的线程 而第一个线程工作时 另一个线程必须测量第一个线程是否在指定时间内计算函数 如果没有 它必须抛出异常 否则返回答案 我会采用 java util concurrent 组件 简单
  • 在GNU Emacs中,如何按模式设置背景颜色?

    在 GNU Emacs 中 我发现我可以在不同模式下为前景类型设置不同的面孔 例如 custom set faces message header to t foreground LightGoldenrod1 weight bold 如何
  • 在詹金斯上安排每两周一次的工作

    我想在 jenkin 上安排每两周一次的工作 它应该每隔一周星期一运行一次 我无法弄清楚 cron 表达式 我做了一些研究 基本上可以归结为 3 个答案 快速回答 你不能 复杂答案1 您可以在单独的行中手动输入每隔一个星期日的条目 但是当年
  • 在Python中旋转位

    出于好奇 我想看看将对象的 id 转换为其哈希值的操作在字符串域中是什么样子 而不是使用通常的按位操作 例如 class A pass def my hash a bits format id a 064b rot4 bits 4 bits
  • Powershell 无法返回正确的退出代码

    使用以下命令执行 Powershell 脚本 2 0 中 时 File命令行开关 并在 Param 中显式定义输入参数 退出代码始终为 0 永不失败 而不是正确返回定义或预期的错误代码 使用显式参数定义和 Command开关 但是出于无关目
  • 使用 iOS Simulator 和 XCode 4 调试应用程序崩溃在 main() 函数中停止,而不是崩溃源 [重复]

    这个问题在这里已经有答案了 可能的重复 Xcode 4 2 出错时显示错误的代码行 https stackoverflow com questions 7973555 xcode 4 2 showing the wrong line of
  • 使用 yum 在 CentOS 上安装 OpenJDK 11

    我想使用 yum 安装 OpenJDK 11 然而 当我检查 OpenJDK 手册时 它说你只能使用 yum 安装 Java 8 但是 对于 Java 9 及以上版本 它说你必须下载 zip 或 tar 文件 https openjdk j
  • GPS 应用程序在 iOS 5 上停止工作 - 位置管理器未更新

    我开发了一个针对 iOS 4 3 的应用程序 效果很好 但自从我迁移到 iOS 5 0 以来 该应用程序开始表现出奇怪的行为 位置管理器不显示位置变化的更新 有人遇到过这种问题吗 谢谢你的帮助 我与 CLLocation 经理共享票价 出现
  • 没有 Visual Studio 2010 的 T4 代码生成?

    是否可以在不需要 Visual Studio 2010 的情况下运行 T4 代码生成 基本上我必须构建一个内部 ORM 不要问 如果我有选择我不会 我计划使用亚音速作为基础 但改变一些东西及其工作方式 然而我的主要问题是我可以从我编写的外部
  • Spring Data Elasticsearch (4.x) - 使用 @Id 强制 _source 中的 id 字段

    Summary 最近我们升级到 Spring Data Elasticsearch 4 x 这个主要版本的一部分意味着 Jackson 不再用于将我们的域对象转换为 json 使用MappingElasticsearchConverter相
  • 静态库中的 Objective-C 类别

    你能指导我如何正确地将静态库链接到 iPhone 项目吗 我使用添加到应用程序项目中的静态库项目作为直接依赖项 目标 gt 常规 gt 直接依赖项 并且所有工作正常 但类别 静态库中定义的类别在应用程序中不起作用 所以我的问题是如何将某些类
  • 在 django 中使用 pika 的 Rabbitmq 监听器

    我有一个 django 应用程序 我想使用来自rabbit mq 的消息 我希望监听器在启动 django 服务器时开始使用 我正在使用 pika 库连接到rabbitmq 提供一些代码示例确实会有帮助 首先 您需要在 django 项目开
  • Chrome 扩展程序:无法加载 JavaScript 文件

    我发布了有关我的 Chrome 扩展程序的另一个问题here https stackoverflow com questions 28303597 tumblr dashboard modifications per chrome exte
  • 使用 apply 函数填充 NA 矩阵

    我想使用 apply 函数填充一个空矩阵 例如我的目的是简化下面的代码 tmp lt matrix NA 10 10 tmp 1 lt sample 1 500 10 tmp 2 lt sample 1 500 10 tmp 10 lt s
  • 在 PHP 中获取 SCOPE_IDENTITY()

    一直在尝试获取 SCOPE IDENTITY 插入数据库的最后一个 ID 并将其作为变量存储在我的 PHP 函数中 看了我在 stackoverflow 上可能找到的所有答案 但我仍然没有找到答案 这就是我目前所拥有的 Confirm bo
  • 创建现有 SOAP Web 服务的 REST 包装器

    我有一个 NET Web 服务 它是一个 SOAP 服务 我想将其转换为 REST 服务 我必须使用哪些选项来创建该中间件才能 接受请求并致电肥皂服务 翻译 SOAP 服务返回的结果 将响应返回给请求者 你有两个选择 1 只需创建一个具有两
  • 仅协议方案支持跨源请求,我该怎么办?

    我无法向 php 发送信息 它被阻止了 仅协议方案支持跨源请求 http data chrome chrome extension https 我使用了不同的 只有三分之一的电脑可以使代码工作 document on ready funct
  • Azure 服务总线主题分区

    我正在尝试向使用两者创建的主题发送消息启用重复检测 and 启用分区选项已选中 我不设置SessionId and PartitionKey我的属性BrokeredMessage实例 根据this https learn microsoft
  • 在 Android 中使用 AES/CBC/PKCS5Padding 解密不正确

    我在 Android v2 2 API 8 中编写了以下代码 其中输入纯文本 代码使用用户密码和随机盐对其进行加密 然后解密 运行代码后 我只得到部分正确的纯文本 例如用户输入 Msg 1 5 to encrypt 解密结果为 Msg15t