AESCBCPKCS5Padding encryption java to php with IV values in array in Java - 如何将Java代码转换为PHP?

问题描述 投票:-1回答:1

我需要在php中进行加密和解密。我有需要转换为Java的Sample Java代码,我在下面给出了。虽然我已经搜索过了,但我无法找到一个iv值是以数组形式给出的实例(我想)。请看下面的Java代码

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.FileInputStream;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import java.net.URL; 
import java.net.URLEncoder; 
import java.net.URLDecoder; 

public class SecurityTest {

private static byte[] sharedkey = "A1234&ABCDE/98745#000078".getBytes();

private static byte[] sharedvector = {8, 7, 5, 6, 4, 1, 2, 3, 18, 17, 15, 16, 14, 11, 12, 13};

private static String decyptString ;
    public static void main(String args[]) 
    {
        SecurityTest test = new SecurityTest();
        System.out.println("Before assignment :"+sharedkey);
        System.out.println("IV Value is :"+sharedvector);

            sharedkey = "A1234&ABCDE/98745#000078".getBytes();
            System.out.println("API Doc Key :"+sharedkey);
            decyptString = "f5s0RMaYtr4WQseVR9E%2F3A%3D%3D";

        String text = "Hello World";
        System.out.println("This is a hello world encryption effort");
        test.EncryptButton("Hello World");

        test.DecryptButton(decyptString);

    }

private void EncryptButton(String actualTxt){
        try{
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "AES"), new IvParameterSpec(sharedvector));
        byte[] encrypted = c.doFinal(actualTxt.getBytes("UTF-8"));
        String strret = Base64.getEncoder().encodeToString(encrypted);
        strret = strret.replace("\n", "");
        System.out.println("Encoded String :"+strret);
        System.out.println("URL Encoded :"+URLEncoder.encode(strret,"UTF-8"));
        }catch(Exception e){
        e.printStackTrace();
        }

    }
private void DecryptButton(String encryptedString){
    try{

        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sharedkey, "AES"), new IvParameterSpec(sharedvector));
        // byte[] decrypted = c.doFinal(Base64.getDecoder().decode(URLDecoder.decode(encryptedString,"UTF-8")));
        byte[] decrypted = c.doFinal(Base64.getDecoder().decode(URLDecoder.decode(encryptedString,"UTF-8")));
        System.out.println(new String(decrypted, "UTF-8"));
        }catch(Exception e){
        e.printStackTrace();
        }
    }
}

我见过在PHP中使用openssl加密的例子,但是IV值并不是像这里给出的那样,像一个数组。IV值是在字节数组sharedvector中。

private static byte[] sharedvector = {8, 7, 5, 6, 4, 1, 2, 3, 18, 17, 15, 16, 14, 11, 12, 13}。

我如何在PHP中写这个IV?

谁能告诉我正确的方向?

谢谢。

java php encryption aes
1个回答
0
投票

按你的代码写的字节数组建立一个字节数组的用法 小数 值,并将其转换为 六角字符串表示方法如下。

byte[] sharedvector = {8, 7, 5, 6, 4, 1, 2, 3, 18, 17, 15, 16, 14, 11, 12, 13};
System.out.println("\nsharedvector (Java): " + bytesToHex(sharedvector));
// byte array to hexstring method:
private static String bytesToHex(byte[] bytes) {
        StringBuffer result = new StringBuffer();
        for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        return result.toString();
    }

结果。

sharedvector (Java): 080705060401020312110f100e0b0c0d

在PHP中,同样的工作流程--请注意Java中的十进制值是手动转换为十六进制值的。

$sharedvector =  "\x08\x07\x05\x06\x04\x01\x02\x03\x12\x11\x0f\x10\x0e\x0b\x0c\x0d";
$sharedvectorHex = unpack('H*', $sharedvector);
echo "sharedvector (PHP): " . $sharedvectorHex[1];

结果如下

sharedvector (PHP) : 080705060401020312110f100e0b0c0d

当然你可以用PHP函数将十进制值转换成十六进制值,但我太懒了,无法为一个16字节的静态值实现这个功能 :-)

Function in PHP:
dechex ( int $number ) : string
© www.soinside.com 2019 - 2024. All rights reserved.