【问题标题】:How to change Java AES ‐ CBC with PKCS5 Padding to PHP如何将 Java AES - CBC 与 PKCS5 填充更改为 PHP
【发布时间】:2019-06-17 02:08:40
【问题描述】:

我正在尝试将 JAVA 加密更改为 PHP 并产生完全相同的结果。 我有以下准则。 AES - CBC 与 PKCS5 填充对称加密方案:

加密密钥大小为 128 位大小。

初始化向量(IV):

-​每个请求都会使用新的随机IV。 -​在单个 Web 服务请求中,在加密所有加密字段时将使用相同的 IV。 -​此 IV 将在名称为“IV”的 SOAP Header 中传递。 IV 值将采用 Base64 编码。

我试过这个https://gist.github.com/thomasdarimont/fae409eaae2abcf83bd6633b961e7f00

public class AESEncryptionUtil {
public static final String CLASS_NAME = AESEncryptionUtil.class.getName(); private static final int KEY_SIZE = 16;
private static final String ALGORITHM_AES = "AES";
public final static String ALGORITHM_AES_CBC = "AES/CBC/PKCS5Padding";

private static Key generateKey(String keyValue) throws Exception { Key key = null ;
if (keyValue!=null && keyValue.length()==KEY_SIZE){
byte[] byteKey = keyValue.substring(0, KEY_SIZE).getBytes("UTF-8");  
key = new SecretKeySpec(byteKey, ALGORITHM_AES);
}else{
System.out.println("Not generating the Key!! "+keyValue); }
return key; 
}
/**
* Return Base64 Encoded value of IV *
* @param keyValue * @return
* @throws Exception */
public static String generateIV(String keyValue) throws Exception { String iv = null ;
Key key = generateKey(keyValue); if (key!=null){
Cipher cipher = Cipher.getInstance(ALGORITHM_AES_CBC); cipher.init(Cipher.ENCRYPT_MODE, key); AlgorithmParameters params =     cipher.getParameters();
iv = new BASE64Encoder().encode(params.getParameterSpec(IvParameterSpec.class).getIV()); 
 }else{
System.out.println("No IV generated ...");
}
return iv; }

/**
* Method to perform encryption of given data with AES Algorithm / Key and IV. * @param encKey -
*​Encryption Key value * @param plainVal -
*​Value to be encrypted * @return - encrypted String Value * @throws   Exception
*/
public static String encrypt(String encKey, String plainVal, String currentIV) throws Exception {

String encryptedText = null ; Key key = generateKey(encKey);
if (key!=null && currentIV!=null && plainVal!=null){
 Cipher c = Cipher.getInstance(ALGORITHM_AES_CBC);
 c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new BASE64Decoder().decodeBuffer(currentIV)));
byte[] encValue = c.doFinal(plainVal.getBytes()); encryptedText= new BASE64Encoder().encode(encValue);
}else{
System.out.println("Invalid input passed to encrypt !! keyValue="+encKey+", IV="+currentIV+", valueToEnc="+plainVal);
}
return encryptedText; }
}

【问题讨论】:

    标签: java php encryption aes php-openssl


    【解决方案1】:

    我设法得到了一些工作

    <?php
    $string = "online1234";
    $key = "haskingvista127$";
    
    $iv  = base64_encode(openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-128-cbc')));
    
    $encodedEncryptedData = base64_encode(openssl_encrypt($string, "AES-128-CBC", $key, OPENSSL_RAW_DATA, base64_decode($iv)));
    
    $decryptedData = openssl_decrypt(base64_decode($encodedEncryptedData), "AES-128-CBC", $key, OPENSSL_RAW_DATA, base64_decode($iv));
    
    ?>
    

    希望这可能对其他人有所帮助

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2021-08-16
      • 2017-04-08
      • 1970-01-01
      • 2021-01-20
      • 2023-02-07
      • 2021-09-13
      • 2011-06-24
      • 1970-01-01
      相关资源
      最近更新 更多