阿里云的企业图谱API解密程序只给提供的node和java的想要个PHP的,但是我比较菜,所以求大佬看着node或者java写一个PHP版本的具体代码如下node:
var crypto=require('crypto');
decrypt = function(data,token){
var secretKey = '';
if(token.length>=16){
secretKey = token.slice(0,16);
}else{
secretKey = token +'0000000000000000'.slice(0,16-token.length);
}
var decipher = crypto.createDecipher('aes-128-ecb',secretKey);
return decipher.update(data,'hex','utf8')+ decipher.final('utf8') ;
}
}java:
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class APIDecrypt {
private static String decrypt(String data, String token) throws Exception {
String seed = "";
if(token.length()>=16){
seed = token.substring(0,16);
}else{
seed = token +"0000000000000000".substring(0, 16-token.length());
}
String DEFAULT_CODING = "utf-8";
byte[] keyb = seed.getBytes(DEFAULT_CODING);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(keyb);
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");
Cipher dcipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, skey);
byte[] clearbyte = dcipher.doFinal(toByte(data));
return new String(clearbyte);
}
public static byte[] toByte(String hexString) {
int len = hexString.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++){
result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
}
return result;
}
}
var crypto=require('crypto');
decrypt = function(data,token){
var secretKey = '';
if(token.length>=16){
secretKey = token.slice(0,16);
}else{
secretKey = token +'0000000000000000'.slice(0,16-token.length);
}
var decipher = crypto.createDecipher('aes-128-ecb',secretKey);
return decipher.update(data,'hex','utf8')+ decipher.final('utf8') ;
}
}java:
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class APIDecrypt {
private static String decrypt(String data, String token) throws Exception {
String seed = "";
if(token.length()>=16){
seed = token.substring(0,16);
}else{
seed = token +"0000000000000000".substring(0, 16-token.length());
}
String DEFAULT_CODING = "utf-8";
byte[] keyb = seed.getBytes(DEFAULT_CODING);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(keyb);
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");
Cipher dcipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
dcipher.init(Cipher.DECRYPT_MODE, skey);
byte[] clearbyte = dcipher.doFinal(toByte(data));
return new String(clearbyte);
}
public static byte[] toByte(String hexString) {
int len = hexString.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++){
result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
}
return result;
}
}
$iv = "1234567812345678";
$data = "Test String";
//加密
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
echo(base64_encode($encrypted));
echo '<br/>';
//解密
$encryptedData = base64_decode("2fbwW9+8vPId2/foafZq6Q==");
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);
echo($decrypted);
你可以试试
这个对应 java 的 Cipher.getInstance("AES/CBC/NoPadding")
而你的是 Cipher.getInstance("AES/ECB/PKCS5Padding")
可能会有出入