Rails Rails AES 加密后用 php 解密不了

ziu · April 20, 2014 · Last by ziu replied at April 27, 2014 · 6472 hits

使用 AES(http://rubygems.org/gems/aes) 加密

require 'aes'

@key="aee18b71a9c35809baa8aa8f61fe6d8e"

iv=AES.iv(:base_64)
#=>"C49NhRMGQczrZYW3KewUQg=="
@message="hello;world"
enc64 = AES.encrypt(@message, @key, {:iv => iv})

p enc64

#=>"C49NhRMGQczrZYW3KewUQg==$/oBI179r+7o6ceLfV2omJQ=="  iv 和密文使用$符连接

<?php

$str="/oBI179r+7o6ceLfV2omJQ==";
$iv_dec="C49NhRMGQczrZYW3KewUQg==";
$key="aee18b71a9c35809baa8aa8f61fe6d8e";
$message=mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key,
                                $str, MCRYPT_MODE_CBC, $iv_dec);

?>

#PHP Warning:  mcrypt_decrypt(): The IV parameter must be as long as the blocksize in /home/fan/rails/Test/aes2.php on line 7
#提示 IV的长度与块长度不一致。

怎么回事?ruby 下的字符长度与 php 怎么换算?(ruby 是没有字符长度多少比特这一说法的吧)

谢谢!

这个 iv 是 128 位的 base64, 不适合用做 aes-256 的 iv

aes 有很多变种的,ruby 中用标准库 openssl 的 aes 就和 mcrypt 的算法一致了

require 'openssl'
aes = OpenSSL::Cipher::AES256.new('CBC').encrypt
aes.key = "aee18b71a9c35809baa8aa8f61fe6d8e"
p aes.random_iv # "nYV\xAFj\xF6\x98\x95\xDA4\xE7\xE9\xAD\x90}2"

message = "hello;world"
enc = aes.update(message) << aes.final
p enc # "hX\xCB\r3\x12\xC4\x840\xDB\xF4\x8F\xCBzJ\xD2"

对应的 php 大概是这样

<?php
$str = "hX\xCB\r3\x12\xC4\x840\xDB\xF4\x8F\xCBzJ\xD2";
$key = "aee18b71a9c35809baa8aa8f61fe6d8e";
$iv = "nYV\xAFj\xF6\x98\x95\xDA4\xE7\xE9\xAD\x90}2";
$message = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $str, MCRYPT_MODE_CBC, $iv);
?>

#1 楼 @night_song 赞!这个解答我要记下来!

#2 楼 @ericguo 额我之前写的有点问题,encrypt 应该在 new 以后,设定 key 和 iv 之前调用..

#3 楼 @night_song 谢啦。后来实在是没整出来,用了 js 加密。

You need to Sign in before reply, if you don't have an account, please Sign up first.