gpt4 book ai didi

php - 在 PHP 中加密 (mcrypt),在 Ruby 中解密 (OpenSSL::Cipher)

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:02 24 4
gpt4 key购买 nike

我正在做一个跨语言项目,用 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 是兼容的,但这个假设不正确吗?我能得到的任何帮助都是最有帮助的。

最佳答案

I was lead to believe Mcrypt's RIJNDAEL and Cipher's AES were compatible, but is this assumption incorrect?

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

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

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

关于php - 在 PHP 中加密 (mcrypt),在 Ruby 中解密 (OpenSSL::Cipher),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21485437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com