【问题标题】:Encrypting in PHP (mcrypt), Decrypting in Ruby (OpenSSL::Cipher)用 PHP 加密(mcrypt),用 Ruby 解密(OpenSSL::Cipher)
【发布时间】:2014-02-24 11:08:57
【问题描述】:

我正在开发一个跨语言项目,该项目在 PHP 中封装了一个 ruby​​/Sinatra API,以供另一个团队使用。 API 公开的所有信息都不是敏感信息,但我们希望猜测 URL 的临时观察者不容易访问这些信息。

    private function generateSliceIDToken($key){
    $currentEpoch = time();
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
    $encryptedBytes = mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        $key,
        $currentEpoch.**Passcode**,
        MCRYPT_MODE_CBC, $iv
    );
    $ivAndEncryptedBytes = $iv . $encryptedBytes;

    return urlencode(urlencode(base64_encode($ivAndEncryptedBytes)));

上面的代码使用 mcrypt 的 RIJNDAEL 实现加密密码和时间戳并将其编码以发送到 ruby​​ API

if identifier.validate_token Base64.decode64(URI.unescape( URI.unescape(params[:token])))

Sinatra 抓取并解码

def validate_token(token)
  cipher = OpenSSL::Cipher::AES.new(128, 'CBC')
  cipher.decrypt
  cipher.key = **key**
  cipher.iv = token[0,16]

  plain = cipher.update(token[16..-1]) + cipher.final
  return plain[10,8] == **Passcode**
end

并传递它以进行解密

问题是,解密失败并出现“Bad Decrypt”错误

我被引导相信 Mcrypt 的 RIJNDAEL 和 Cipher 的 AES 是兼容的,但这个假设是否不正确?我能得到的任何帮助都是最有帮助的。

【问题讨论】:

    标签: php ruby encryption mcrypt


    【解决方案1】:

    我被引导相信 Mcrypt 的 RIJNDAEL 和 Cipher 的 AES 是兼容的,但这个假设是否不正确?

    您需要稍微调整正在编码的数据以使其与 AES 兼容。数据必须右填充,字符和数量取决于其当前宽度:

    $encode = $currentEpoch.'**Passcode**';
    $len = strlen($encode);
    $pad = 16 - ($len % 16);
    $encode .= str_repeat(chr($pad), $pad);
    

    还要记住$key 的长度正好是 16 个字符。如果它更短,ruby 会抛出 CipherError,而 php 会用空字节填充键。如果它更长,ruby 只使用前 16 个字符,但 php 再次填充它,并使用后 16 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2015-10-09
      • 2015-11-10
      • 2013-04-14
      • 2011-10-13
      • 2013-12-28
      • 2018-12-04
      相关资源
      最近更新 更多