一个java api里面的加密解密过程,现在希望通过php实现,捣鼓了半天搞不定,特来求助加密过程:
1.把待加密字符串S转换成UTF-8编码的字节数组B。
2.把B补齐成8的整数倍,用0x00进行填充,填充后形成B1,补齐0x00的个数为M1。
3.随机生成16字节的DESede密钥K1。
4.使用K1对B1进行DESede加密,生成M2。
5.使用RSA公钥对K1进行RSA加密,生成M3。
6.把M1、M2、M3拼装在一起形成最终密文M。
M=M1+M2+M3
7.把M转换成16进制字符串H
例如: 0x05,0x6A,0x67,0x8D --> “056A678D”加密示例:
明文=”hi, this is a test”
密钥:
模数=251767060929432528453674665284960515581
公钥子数=65537
私钥子数=223973071491032169187666453871333169473使用公钥(模数和公钥子数)加密,
结果= "0680BC9567A89E567D50211F5DAAD828EB1DE1E334E0F939D1459
B0194CBE56CC9F830BC0217210EC7170D9D7BCE1AEA12CE84FB9414777D39"使用私钥(模数和私钥子数)解密,
结果=”hi, this is a test”
1.把待加密字符串S转换成UTF-8编码的字节数组B。
2.把B补齐成8的整数倍,用0x00进行填充,填充后形成B1,补齐0x00的个数为M1。
3.随机生成16字节的DESede密钥K1。
4.使用K1对B1进行DESede加密,生成M2。
5.使用RSA公钥对K1进行RSA加密,生成M3。
6.把M1、M2、M3拼装在一起形成最终密文M。
M=M1+M2+M3
7.把M转换成16进制字符串H
例如: 0x05,0x6A,0x67,0x8D --> “056A678D”加密示例:
明文=”hi, this is a test”
密钥:
模数=251767060929432528453674665284960515581
公钥子数=65537
私钥子数=223973071491032169187666453871333169473使用公钥(模数和公钥子数)加密,
结果= "0680BC9567A89E567D50211F5DAAD828EB1DE1E334E0F939D1459
B0194CBE56CC9F830BC0217210EC7170D9D7BCE1AEA12CE84FB9414777D39"使用私钥(模数和私钥子数)解密,
结果=”hi, this is a test”
{
byte desKey[];
int padLen;
byte desData[];
desKey = generateRandomDESedeKey();
byte srcByte[] = src.getBytes("UTF-8");
padLen = srcByte.length % 8 != 0 ? 8 - srcByte.length % 8 : 0;
byte srcBytePadding[] = new byte[srcByte.length + padLen];
System.arraycopy(srcByte, 0, srcBytePadding, 0, srcByte.length);
desData = ThreeDESUtil.encryptData(desKey, srcBytePadding);
if (desData == null)
return null;
byte rasData[];
RSAPublicKey rsaKey = RSAUtil.createRSAPublicKeyByModulus(mod, pubEx);
rasData = RSAUtil.encrypt(rsaKey, desKey);
if (rasData == null)
return null;
String ret;
ret = "";
ret = (new StringBuilder(String.valueOf(ret))).append(StringUtil.byte2hex(new byte[] {
(byte)(padLen & 0xff)
})).toString();
ret = (new StringBuilder(String.valueOf(ret))).append(StringUtil.byte2hex(desData)).toString();
ret = (new StringBuilder(String.valueOf(ret))).append(StringUtil.byte2hex(rasData)).toString();
return ret;
Exception e;
e;
e.printStackTrace();
return null;
}public static String decryptByPrivate(String src, String mod, String priEx)
{
String ret;
byte srcByte[] = StringUtil.hex2byte(src);
int padLen = srcByte[0];
byte desData[] = new byte[srcByte.length - 1 - 32];
byte rsaData[] = new byte[32];
System.arraycopy(srcByte, 1, desData, 0, desData.length);
System.arraycopy(srcByte, srcByte.length - rsaData.length, rsaData, 0, rsaData.length);
RSAPrivateKey rsaKey = RSAUtil.createRSAPrivateKeyByModulus(mod, priEx);
byte desKey[] = RSAUtil.decrypt(rsaKey, rsaData);
byte desDec[] = ThreeDESUtil.decryptData(desKey, desData);
byte desRet[] = new byte[desDec.length - padLen];
System.arraycopy(desDec, 0, desRet, 0, desRet.length);
ret = new String(desRet, "UTF-8");
return ret;
Exception e;
e;
e.printStackTrace();
return null;
}
1.把待加密字符串S转换成UTF-8编码的字节数组B。
设 $s 为 utf-8 字符串,则
$B = unpack('C*', $s);2.把B补齐成8的整数倍,用0x00进行填充,填充后形成B1,补齐0x00的个数为M1。
$M1 = count($B) % 8;
$B1 = $B;
for($i=0; $i<$M1; $i++) $B1[] = 0;3.随机生成16字节的DESede密钥K1。
4.使用K1对B1进行DESede加密,生成M2。
5.使用RSA公钥对K1进行RSA加密,生成M3。
6.把M1、M2、M3拼装在一起形成最终密文M。
M=M1+M2+M3
7.把M转换成16进制字符串H
例如: 0x05,0x6A,0x67,0x8D --> “056A678D”
假定 $M 是字符串
则 $H = current(unpack('H*', $M));
把字节数组换原成字符串:
array_unshift($array, 'C*');
$str = call_user_func_array('pack', $array);