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

与PHP中的AES-256-CBC-HMAC-SHA256等效的Android

洪英豪
2023-03-14

我可以在Android应用程序JSON中接收$data。

我得解密应用程序里的$数据。

我使用的结构如下所示:

private static final String engine = "AES";
private static final String crypto = "AES/CBC/PKCS5Padding";
[...]

public byte[] cipher(byte[] data, int mode, String key, String iv2) throws NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,IllegalBlockSizeException,BadPaddingException,InvalidAlgorithmParameterException {        
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), engine);
    IvParameterSpec iv = new IvParameterSpec(iv2.getBytes());
    Cipher c = Cipher.getInstance(crypto);
    c.init(mode, sks, iv);
    return c.doFinal(data);
}

public byte[] decrypt(byte[] data,  String key, String iv) throws InvalidKeyException,
        NoSuchAlgorithmException, NoSuchPaddingException,
        IllegalBlockSizeException, BadPaddingException,
        InvalidAlgorithmParameterException {
    return cipher(data, Cipher.DECRYPT_MODE,key,iv);
}

但是将engine定义为“AES”而将crypto定义为“AES/CBC/PKCS5Padding”会引发一个错误,因为它与来自服务器的不等价。

另一方面,将加密函数与该密码函数一起使用,然后再对其进行解密也是有效的,因为加密和解密都是使用相同的密钥iv、引擎和密码完成的。

哪一个是PHP中AES-256-CBC-HMAC-SHA256的引擎和加密等价物?

共有1个答案

云开诚
2023-03-14

我在回答你的问题,但我很困惑...你会看到:-)。

首先我设置了一个简单的PHP程序,有2个en-/decryption函数,它们使用了以下算法:

$algorithm = "aes-256-cbc-hmac-sha256";
$algorithm2 = "aes-256-cbc";

代码:

<?php
// https://stackoverflow.com/questions/63135041/android-equivalent-to-aes-256-cbc-hmac-sha256-in-php
$key = "!mysecretkey#9^5usdk39d&dlf)03sL";
$iv = "Cfq84/46Qjet3EEQ1HUwSg==";
$plaintext = "The quick brown fox jumps over the lazy dog";

$algorithm = "aes-256-cbc-hmac-sha256";
echo 'encryption with algorithm: ' . $algorithm . PHP_EOL;
// encryption
$ciphertext = openssl_encrypt($plaintext, $algorithm, $key, $options = OPENSSL_RAW_DATA, base64_decode($iv));
echo 'ciphertext : ' . base64_encode($ciphertext) . PHP_EOL;
// decryption
$decryptedtext = openssl_decrypt($ciphertext, $algorithm, $key, $options = OPENSSL_RAW_DATA, base64_decode($iv));
echo 'cbc-256-hmac decrypt : ' . $decryptedtext . PHP_EOL . PHP_EOL;

$algorithm2 = "aes-256-cbc";
echo 'encryption with algorithm: ' . $algorithm2 . PHP_EOL;
$ciphertext2 = openssl_encrypt($plaintext, $algorithm2, $key, $options = OPENSSL_RAW_DATA, base64_decode($iv));
echo 'ciphertext2: ' . base64_encode($ciphertext2) . PHP_EOL;
// decryption
$decryptedtext2 = openssl_decrypt($ciphertext2, $algorithm2, $key, $options = OPENSSL_RAW_DATA, base64_decode($iv));
echo 'cbc-256 decrypt      : ' . $decryptedtext2 . PHP_EOL;
?>
encryption with algorithm: aes-256-cbc-hmac-sha256
ciphertext : sdFQ/X0YdAlyTe8ICtQSb3aHRGzsAdyXRlUGdocGZS9sckqa2seeYaVD10vYu5wV
cbc-256-hmac decrypt : The quick brown fox jumps over the lazy dog

encryption with algorithm: aes-256-cbc
ciphertext2: sdFQ/X0YdAlyTe8ICtQSb3aHRGzsAdyXRlUGdocGZS9sckqa2seeYaVD10vYu5wV
cbc-256 decrypt      : The quick brown fox jumps over the lazy dog
AES/CBC/PKCS5Padding

已加密的消息已成功解密。所以也许我们的一位“密码大师”能够“现场”解释为什么两个不同的算法会给出相同的输出。

下面是java-result:

decryptedtext: The quick brown fox jumps over the lazy dog

和Java代码:

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class Main {
    public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        System.out.println("https://stackoverflow.com/questions/63135041/android-equivalent-to-aes-256-cbc-hmac-sha256-in-php");

        String key = "!mysecretkey#9^5usdk39d&dlf)03sL";
        String iv = "Cfq84/46Qjet3EEQ1HUwSg==";
        String ciphertext = "sdFQ/X0YdAlyTe8ICtQSb3aHRGzsAdyXRlUGdocGZS9sckqa2seeYaVD10vYu5wV";

        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] decryptedtextByte = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
        String decryptedtext = new String(decryptedtextByte);
        System.out.println("decryptedtext: " + decryptedtext);
    }
}
 类似资料:
  • 问题内容: 我正在尝试编写一个简单的Java程序,该程序将使用加密纯文本。有上课: 有可能的用法: 我的输出是,但是执行此命令时: 我得到的东西与Java程序()有所不同。可悲的是,我不知道为什么结果不一样,因为我使用相同的算法和相同的键和iv。这是否意味着我的Java程序无法正常运行?任何帮助,将不胜感激。 问题答案: 两种方法都可以正常工作,但是您正在加密不同的事物。 此处的字符串语法()在字

  • 我在Erlang中加密AES 256位CBC然后用c代码解密它时遇到了一个问题。而加密/解密在Erlang和C中有效,但不能从一个到另一个。 和 c 代码 我得到的错误是 当我在Erlang中解密时,它可以正常工作,当我在C中加密时,它也可以使用相同的Key和IV。它是否是密码模式不匹配。虽然在我看来是正确的。任何指针都会非常有用。谢谢。 我算出,同样的数据我用C加密和解密,然后进行十六进制转储。

  • 就像我说的,一切都很好,除了这个小的decypt...我搜索了谷歌和所有的东西,尝试了示例代码,但似乎我的代码有些东西不对。

  • 问题内容: 我目前正在使用 256个字节的* 密钥大小来用Java加密文件,但是在搜索时我在stackexchange PKCS#5-PKCS#7填充上发现了它,并提到: * PKCS#5填充是8个字节块大小的PKCS#7填充的子集 所以我想知道 相对于上述配置,性能会更好吗? 正如我们所提到的,我们如何在Java中配置块大小 PKCS#7填充适用于从1到255字节的任何块大小。 我的示例代码是

  • 我已经设法使它能够处理不包含og a-zA-Z0-9之外的字符和一些特殊字符的文本,但如果我使用丹麦字母,如ielouangØ,解密的文本会显示?而不是实际的字母。所有文件都保存为UTF-8,头字符集=UTF-8 Javascript - input: "tester for php: 我试过选项0,OPENSSL_ZERO_PADDING和OPENSSL_RAW_DATA,结果相同。有人能帮我吗

  • 我正在加密我的Android应用程序中的一些数据,然后这些数据被发送到一个PHP页面进行解密和处理。 这有帮助吗?