当前位置: 首页 > 知识库问答 >
问题:

Java (Android) aes-128-cbc 解密为明文不一致

冯宪
2023-03-14

我有一个Java (Android)代码,使用aes-128-cbc将明文加密为密文。我可以用PHP将这个密文解密成对应的明文,但不能用Java本身。

用于加密的Java代码如下:

String iv = "0000000000000000"; //Ignore security concerns
IvParameterSpec ivspec;
ivspec = new IvParameterSpec(iv.getBytes());

String plaintext = "Top Secret Data";
byte[] encrypted = null;

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, seckey, ivspec);
encrypted = cipher.doFinal(padString(plaintext).getBytes());

ciphertext = Base64.encodeToString(encrypted, Base64.DEFAULT);

Log.i("Encrypted Base64 Data", ciphertext);

能够成功解密的相应PHP代码如下,

public function decrypt($data)
{
    $key = $_SESSION['sessionkey'];
    $iv = "0000000000000000";
    $data = base64_decode($data);

    $encobj = mcrypt_module_open('rijndael-128', '', 'cbc', $iv);
    mcrypt_generic_init($encobj, $key, $iv);
    $decrypted = mdecrypt_generic($encobj, $data);

    mcrypt_generic_deinit($encobj);
    mcrypt_module_close($encobj);

    return utf8_encode(trim($decrypted));
}

有问题的Java解密代码会反转为错误的明文,如下所示

String iv = "0000000000000000";
IvParameterSpec ivspec;
ivspec = new IvParameterSpec(iv.getBytes());

byte[] decrypted = null;

Cipher cipher;
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, seckey, ivspec);
decrypted = cipher.doFinal(Base64.decode(ciphertext, Base64.DEFAULT));
Log.i("Decrypted Data",decrypted.toString());

如果有人能指出Java解密代码的问题,我将不胜感激。

共有1个答案

董建茗
2023-03-14

试试这个< br >

  Cipher cipher;
  cipher = Cipher.getInstance("AES/CBC/NoPadding");
  cipher.init(Cipher.DECRYPT_MODE, seckey, ivspec);
  decrypted = cipher.doFinal(Base64.decode(ciphertext, Base64.DEFAULT)); //byte[]
  String result = new String(decrypted);
  Log.i("Decrypted Data",result);
 类似资料:
  • 我用java编写了这段代码,以便解密密文。我有钥匙。对我来说,一切都是正确的,但我有我要解释的问题。 这是我的代码: 我收到以下错误: 出了什么问题?我知道这个问题在某种程度上与衬垫有关,但我不知道确切的解决方案。我只有一个密文IV和密钥。

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/

  • 我正在尝试在python中实现此代码(我是python新手),它给我以下错误: attribute error:“str”对象没有属性“decode” 如果我们删除 只是为了避免这样的错误: 但它给我以下错误: ValueError:IV必须为16字节长 因为算法需要,我必须删除 有没有人知道我该怎么做才能使这段代码工作?

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 问题内容: PHP加密功能 当我尝试使用下面的函数在Java中解密此结果时,我得到的只是“ Test @ string”,而我则是“ @@BKxnfÈ〜¯Ô’M”。有什么想法我错了吗?谢谢 问题答案: 编辑:从Java 8开始,Java现在包括可接受的Base64类。 这条线 看起来错了。而是使用apache commons编解码器类或Harder base64 类。同样,mcrypt使用的默认填

  • 我只需要通过代码加密AES CBC 128位模式的字符串。我使用openssl库完成了这项工作,但无法获得正确的输出。 到目前为止,我已经完成了。 我的十六进制输出是:B0 15 751B50 80 D4 FF 81 68 146BB71B95 99 37 38 但正确的输出是:< code > 73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA (通过