如何把以下 java AES-128-CBC java加密方法法改为 php 的实现

有java和php AES加密经验的人吗?不吝赐教_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:652,369贴子:
有java和php AES加密经验的人吗?不吝赐教收藏
现在因为业务需要,要和php通信,使用AES/ECB方式加密,请求后一直失败,php端加密方法为:function aesEnJm($str, $key){
$block = mcrypt_get_block_size('rijndael_128', 'ecb');
$pad = $block - (strlen($key) % $block);
$key .= str_repeat(chr($pad), $pad);
$str= mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
$str= strToHex($str);
($str);}function strToHex($string)//字符串转十六进制{
return strtoupper(bin2hex($string)) ;
for($i=0;$i&strlen($string);$i++)
$hex.=dechex(ord($string[$i]));
$hex=strtoupper($hex);
请问java端怎么写加密方法?不吝赐教!试过不少,返回结果都不正确
2017java学习来上市公司博为峰学java,入学即签就业协议,不就业不收费,查看java课程!java好学吗?java课程来博为峰学,java工程师就业年薪十几万!
登录百度帐号推荐应用php写的AES加密解密类分享
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了php写的AES加密解密类,实际是为YII框架写的,不在YII框架时只需替换其中的两句代码即可使用,需要的朋友可以参考下
今天写了一个php的AES加密类。适用于Yii的扩展。
如果不用在Yii框架中,把代码中Yii::app()-&params['encryptKey'] 换成你对应的默认key就可以了。
* php AES加解密类
* 如果要与java共用,则密钥长度应该为16位长度
* 因为java只支持128位加密,所以php也用128位加密,可以与java互转。
* 同时AES的标准也是128位。只是RIJNDAEL算法可以支持128,192和256位加密。
* java 要使用AES/CBC/NoPadding标准来加解密
* @author Terry
class PhpAes
* This was AES-128 / CBC / NoPadding encrypted.
* return base64_encode string
* @author Terry
* @param string $plaintext
* @param string $key
public static function AesEncrypt($plaintext,$key = null)
$plaintext = trim($plaintext);
if ($plaintext == '') return '';
if(!extension_loaded('mcrypt'))
throw new CException(Yii::t('yii','AesEncrypt requires PHP mcrypt extension to be loaded in order to use data encryption feature.'));
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key=self::substr($key===null ? Yii::app()-&params['encryptKey'] : $key, 0, mcrypt_enc_get_key_size($module));
/* Create the IV and determine the keysize length, use MCRYPT_RAND
* on Windows instead */
$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));
/* Intialize encryption */
mcrypt_generic_init($module, $key, $iv);
/* Encrypt data */
$encrypted = mcrypt_generic($module, $plaintext);
/* Terminate encryption handler */
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return base64_encode($encrypted);
* This was AES-128 / CBC / NoPadding decrypted.
* @author Terry
* @param string $encrypted
base64_encode encrypted string
* @param string $key
* @throws CException
* @return string
public static function AesDecrypt($encrypted, $key = null)
if ($encrypted == '') return '';
if(!extension_loaded('mcrypt'))
throw new CException(Yii::t('yii','AesDecrypt requires PHP mcrypt extension to be loaded in order to use data encryption feature.'));
$ciphertext_dec = base64_decode($encrypted);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key=self::substr($key===null ? Yii::app()-&params['encryptKey'] : $key, 0, mcrypt_enc_get_key_size($module));
$iv = substr(md5($key),0,mcrypt_enc_get_iv_size($module));
/* Initialize encryption module for decryption */
mcrypt_generic_init($module, $key, $iv);
/* Decrypt encrypted string */
$decrypted = mdecrypt_generic($module, $ciphertext_dec);
/* Terminate decryption handle and close module */
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return rtrim($decrypted,"\0");
* Returns the length of the given string.
* If available uses the multibyte string function mb_strlen.
* @param string $string the string being measured for length
* @return integer the length of the string
private static function strlen($string)
return extension_loaded('mbstring') ? mb_strlen($string,'8bit') : strlen($string);
* Returns the portion of string specified by the start and length parameters.
* If available uses the multibyte string function mb_substr
* @param string $string the input string. Must be one character or longer.
* @param integer $start the starting position
* @param integer $length the desired portion length
* @return string the extracted part of string, or FALSE on failure or an empty string.
private static function substr($string,$start,$length)
return extension_loaded('mbstring') ? mb_substr($string,$start,$length,'8bit') : substr($string,$start,$length);
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具/articles/nERnqe
/AloneSword/p/3485912.html【这里有具体的对称和非对称算法的详细介绍】
c#里面的AES加密解密
在visual studio中写的c#代码
using System.Collections.G
using System.L
using System.T
using System.Security.C
namespace test
class Class1
static void Main(string[] args)
Console.WriteLine(&I am comming&);
String source = &Test String&;
String encryptData = Class1.Encrypt(source, &5678&, &5678&);
Console.WriteLine(&=1==&);
Console.WriteLine(encryptData);
Console.WriteLine(&=2==&);
String decryptData = Class1.Decrypt(&2fbwW9+8vPId2/foafZq6Q==&, &5678&, &5678&);
Console.WriteLine(decryptData);
Console.WriteLine(&=3==&);
Console.WriteLine(&I will go out&);
public static string Encrypt(string toEncrypt, string key, string iv)
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyA
rDel.IV = ivA
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.Z
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
public static string Decrypt(string toDecrypt, string key, string iv)
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyA
rDel.IV = ivA
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.Z
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
其中加密后以及解密后的字符串都能成功打印,但Console.WriteLine(&=3==&);之后的输出就没有了,最后输出个线程返回值0,然后就没有然后了。c#不懂,就不深究了,就已执行的部分,是符合要求了。
Java的AES加密解密:
java代码,测试也是可以的
import javax.crypto.C
import javax.crypto.spec.IvParameterS
import javax.crypto.spec.SecretKeyS
import org.junit.T
public void testCrossLanguageEncrypt() throws Exception{
System.out.println(encrypt());
System.out.println(desEncrypt());
public static String encrypt() throws Exception {
String data = &Test String&;
String key = &5678&;
String iv = &5678&;
Cipher cipher = Cipher.getInstance(&AES/CBC/NoPadding&);
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes();
int plaintextLength = dataBytes.
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), &AES&);
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
return new sun.misc.BASE64Encoder().encode(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
public static String desEncrypt() throws Exception {
String data = &2fbwW9+8vPId2/foafZq6Q==&;
String key = &5678&;
String iv = &5678&;
byte[] encrypted1 = new sun.misc.BASE64Decoder().decodeBuffer(data);
Cipher cipher = Cipher.getInstance(&AES/CBC/NoPadding&);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), &AES&);
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalS
catch (Exception e) {
e.printStackTrace();
return null;
php的AES加密解密
php代码,php很多东西都是提供好的,直接用函数,但是php目前所知填充模式只有ZeroPadding,于是其他语言就只能跟着它来了:
$privateKey = &5678&;
= &Test String&;
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
echo($encrypted);
echo '&br/&';
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);
Javascript下aes加解密,试过也可以,需要在/p/crypto-js/下载工具包
type=&text/javascript& src=&aes.js&&&
type=&text/javascript& src=&pad-zeropadding.js&&&
导入文件,aes.js需要导入crypto-js压缩包中rollups文件夹下的那个aes.js文件,如果引入的是components文件夹下的aes.js是会报错的
type=&text/javascript&&
var data = &Test String&;
= CryptoJS.enc.Latin1.parse('5678');
= CryptoJS.enc.Latin1.parse('5678');
var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
document.write(encrypted.ciphertext);
document.write('&br/&');
document.write(encrypted.key);
document.write('&br/&');
document.write(encrypted.iv);
document.write('&br/&');
document.write(encrypted.salt);
document.write('&br/&');
document.write(encrypted);
document.write('&br/&');
var decrypted = CryptoJS.AES.decrypt(encrypted,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
console.log(decrypted.toString(CryptoJS.enc.Utf8));
成功加解密,最后解密的字符串串在浏览器的控制台里才能看到。
python的AES加密解密
最后加一个python下的aes,需要安装python Crypto:
from Crypto.Cipher import AES
import base64
PADDING = '\0'
pad_it = lambda s: s+(16 - len(s)%16)*PADDING
key = '5678'
iv = '5678'
source = 'Test String'
generator = AES.new(key, AES.MODE_CBC, iv)
crypt = generator.encrypt(pad_it(source))
cryptedStr = base64.b64encode(crypt)
print cryptedStr
generator = AES.new(key, AES.MODE_CBC, iv)
recovery = generator.decrypt(crypt)
print recovery.rstrip(PADDING)
注意python下需要用'\0'来填充,如果是空格来填充,python加密得到的字符串会跟其他语言不同。另外注意generator在加密的时候使用过,解密的时候需重新生成再解密,否则解密失败。最后得到的字符串,在python控制台看到尾部是多个NUL这样的东西,要这样recovery.rstrip(PADDING)去除掉才是原始字符串。
可以看到aes加密的中间结果是byte[]类型,直接new String(byte[])会看不到有意义的中间结果,这里用的是base64,是因为各个语言都有这样的支持。在同个语言内,也有bytesToHexString这样的方式。
跨语言加解密的要求是:AES/CBC/ZeroPadding 128位模式,key和iv一样,编码统一用utf-8。不支持ZeroPadding的就用NoPadding.
本文已收录于以下专栏:
相关文章推荐
AES-CBC-PKCS5Padding加密算法Java实现
工作中,我们常常会遇到跨语言平台的加密解密算法的交互使用,特别是一些标准的加解密算法,都设计到数据块Block与填充算法的
问题,例如C#与JAVA中的常见的填充算法如下:
.Net中的填充算法:...
在visual studio中写的c#代码
using System.Collections.G
using System.L
之前写过的一段python程序代码用来对tar 文件加密,然后发送到客户端,客户端是运行openWRT的路由器,在路由器端用openssl进行解密,先附上代码。
用来加密文件的python code...
在PKCS5Padding中,明确定义Block的大小是8位
    而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间
    PKCS #7 填充字符串由...
AES是新的一种加密模块。
aes/cbc/pkcs5padding/128加解密示例:&?php
class AesEncrypt{
//自定义key
protected $
最近做了一个需求,要和第三方的系统对接,其中数据传输要用对方的要求进行aes加密,之前没接触过aes加密,后来研究了一把,蛋碎了一地,为了避免下次蛋碎,特总结一下:
下面是第三方给的java加密de...
今天项目中要用到这个加解密的东西,找了一天,终于弄好了,现在就记录下来
php 和 java 使用 AES128/ECB/PKCS5Padding对称加解密,签名使用 HmacSHA256,附带 php 和 java 代码,均为 DEMO 版本,测试通过,实际使用请根据自...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 java tcp怎么改为utf8 的文章

 

随机推荐