- 最近需要将一段 php 写的 aes-128-cbc 的加密和解密用 ruby 语言实现,翻译过程中没思路了,不知如何是好!
- 要达到的目的是:ruby 加密解密的结果能直接兼容这个被翻译的 php 加密机密方法。
==========================================================================================
- php 加密方法:
public static function aes128cbcEncrypt($key, $text) {
/* Open the cipher */
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
if (! $td) {
throw new GeneralSecurityException('Invalid mcrypt cipher, check your libmcrypt library and php-mcrypt extention');
}
// replaced MCRYPT_DEV_RANDOM with MCRYPT_RAND since windows doesn't have /dev/rand :)
srand((double)microtime() * 1000000);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
/* Intialize encryption */
mcrypt_generic_init($td, $key, $iv);
/* Encrypt data */
$encrypted = mcrypt_generic($td, $text);
/* Terminate encryption handler */
mcrypt_generic_deinit($td);
/*
* AES-128-CBC encryption. The IV is returned as the first 16 bytes
* of the cipher text.
*/
return $iv . $encrypted;
}
- php 解密方法:
public static function aes128cbcDecrypt($key, $encrypted_text) {
/* Open the cipher */
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
if (is_callable('mb_substr')) {
$iv = mb_substr($encrypted_text, 0, Crypto::$CIPHER_BLOCK_SIZE, 'latin1');
} else {
$iv = substr($encrypted_text, 0, Crypto::$CIPHER_BLOCK_SIZE);
}
/* Initialize encryption module for decryption */
mcrypt_generic_init($td, $key, $iv);
/* Decrypt encrypted string */
if (is_callable('mb_substr')) {
$encrypted = mb_substr($encrypted_text, Crypto::$CIPHER_BLOCK_SIZE, mb_strlen($encrypted_text, 'latin1'), 'latin1');
} else {
$encrypted = substr($encrypted_text, Crypto::$CIPHER_BLOCK_SIZE);
}
$decrypted = mdecrypt_generic($td, $encrypted);
/* Terminate decryption handle and close module */
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
/* Show string */
return trim($decrypted);
}
-------------------------------------------------------------------------
# 翻译demo
- ruby encryption:
require 'openssl'
text = "abcdefghijklmnopqrstuvwxyz"
key = "1234567890123456"
alg = "AES-128-CBC"
iv = "6543210987654321"
file_name = "ruby.encrypted"
file_name_2 = "ruby.decrypted"
puts %(clear text: "#{text}")
puts %(symmetric key: "#{key}")
puts %(initialization vector: "#{iv}")
puts %(cipher alg: "#{alg}")
puts "--Encrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.encrypt
des.key = key
des.iv = iv
cipher = des.update(text)
cipher << des.final
puts %(encrypted text: #{cipher})
puts
file = File.open(file_name, "w")
file.truncate(0)
file << cipher
file.close
- ruby decryption:
require 'openssl'
text = "abcdefghijklmnopqrstuvwxyz"
key = "1234567890123456"
alg = "AES-128-CBC"
iv = "6543210987654321"
file_name = "ruby.encrypted"
file_name_2 = "ruby.decrypted"
puts %(clear text: "#{text}")
puts %(symmetric key: "#{key}")
puts %(initialization vector: "#{iv}")
puts %(cipher alg: "#{alg}")
file = File.open(file_name, "r")
text = file.read(999999)
file.close
puts "--Decrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.decrypt
des.key = key
des.iv = iv
out = des.update(text)
out << des.final
puts %(decrypted text: "#{out}")
puts
file = File.open(file_name_2, "w")
file.truncate(0)
file << des.final
file.close
- php encryption:
$text = "abcdefghijklmnopqrstuvwxyz";
$key = "1234567890123456";
$alg = "rijndael-128";
$iv = "6543210987654321";
$file_name = "php.encrypted";
$file_name_2 = "php.decrypted";
$mode = "cbc";
echo("clear test: $text\n");
echo("symmetric key: $key\n");
echo("initialization vector: $iv\n");
echo("cipher alg: $alg\n");
$td = mcrypt_module_open($alg, NULL, $mode, NULL);
//$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), $iv);
mcrypt_generic_init($td, $key, $iv);
$result = mcrypt_generic($td, $text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "result: $result\n";
$file = fopen($file_name, "w");
fwrite($file, $result);
fclose($file);
- php decryption:
$text = "abcdefghijklmnopqrstuvwxyz";
$key = "1234567890123456";
$alg = "rijndael-128";
$iv = "6543210987654321";
$file_name = "php.encrypted";
$file_name_2 = "php.decrypted";
$mode = "cbc";
$file = fopen($file_name, "r");
$text = fread($file, filesize($file_name));
fclose($file);
echo("clear test: $text\n");
echo("symmetric key: $key\n");
echo("initialization vector: $iv\n");
echo("cipher alg: $alg\n");
$td = mcrypt_module_open($alg, NULL, $mode, NULL);
//$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), $iv);
mcrypt_generic_init($td, $key, $iv);
$result = mdecrypt_generic($td, $text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "result: >>>$result<<<\n";
$file = fopen($file_name_2, "w");
fwrite($file, $result);
fclose($file);
==========================================================================================
从demo的运行对比来看加密解密貌似不兼容,我只是最近才接触这个东西,在此希望这方面的高手同行给予些帮助,
Thanks.
分享到:
相关推荐
7. **PHP**: PHP有`openssl`扩展,可以通过`openssl_encrypt`和`openssl_decrypt`函数实现AES-256加密解密,同时还有第三方库如`defuse/php-encryption`。 8. **Ruby**: Ruby的`openssl`库提供了AES-256的支持,...
本资源包"ruby-使用ruby实现的算法之加密解密算法.zip"显然包含了关于如何在Ruby中实现加密和解密算法的实例和代码。下面将详细介绍Ruby中常用的加密解密方法及相关知识点。 1. **基本概念** - **加密**:是将明文...
AES Everywhere是跨语言加密库,它提供了使用单一算法在不同编程语言和不同平台上对数据进行加密和解密的功能。 这是AES算法(特别是CBC模式)的实现,具有256位密钥长度和PKCS7填充。 它使用随机生成的盐实现与...
用于加密和解密字符串的简单 Android 类,旨在避免大多数此类类受到影响。 特征 下面是这个类的特点。 我们相信这些属性与很多人在 Android 中加密字符串时所寻求的一致。 适用于字符串:它应该加密任意字符串或字节...
Ruby-Lockbox是一款针对Ruby和Rails应用的安全库,主要用于实现文件和数据的加密。它提供了简单易用的接口,让开发者能够轻松地在应用程序中集成高级加密标准(AES)和其他密码学算法,确保敏感信息的安全性。 Ruby...
使用的加密算法是CBC和CFB模式下的AES。 主要出于兼容性原因,未提供其他模式(.NET Framework)。 密文的真实性已通过HMAC SHA256进行了验证。 加密的数据包含salt,iv和mac,其格式为:salt [16] + iv [16] +密文...
设想的用例是在使用公钥将数据保存到服务器或移动设备之前对数据进行加密,并且仅在将数据发送到具有私钥的另一台服务器时才解密该数据。 它的工作原理是生成一个随机 AES 密钥,使用该生成的密钥加密文本,使用 ...
5. **客户端解密**:在客户端,需要相应的解密机制来解码接收到的加密响应,使用相同的共享密钥和AES CBC 128位算法。 6. **调试与测试**:在开发过程中,使用byebug可以方便地检查加密过程,确保数据在传输过程中...
你可以创建一个新的Cipher对象,选择加密算法(如AES-256-CBC),并设置工作模式(加密或解密)。 - 在加密过程中,你需要提供一个密钥和初始化向量(IV)来确保数据的安全性。 - 解密时,必须使用相同的密钥和IV...
kms_attrs是可轻松将Amazon Web Services KMS加密添加到ActiveRecord模型属性的瑰宝。 它使用GenerateDataKey方法使用OpenSSL AES-256-CBC密码在本地执行“信封”加密。 要使用,只需将以下代码放入要加密的字段的...
openssl aes-256-cbc \ -e \ -md sha1 \ -in ./config/secrets/ci/gpg.private \ -out ./.circleci/gpg.private.enc \ -k " <passphrase> " 要检查解密是否正常工作: openssl aes-256-cbc \ -d \ -md sha1...
然后,可以调用提供的API来进行加密和解密操作,这些API通常会包含初始化加密上下文、设置密钥、执行加密和解密的方法。 5. **示例代码** 以下是一个简化的示例,展示了如何使用crystal-crypt进行加密和解密: ...
在Ruby中,可以使用OpenSSL::Cipher类来创建一个AES加密器,设置加密模式(如CBC或ECB),并使用随机生成的初始化向量(IV)增加安全性。AES加密过程通常包括:选择一个密钥,创建一个加密器实例,设置模式和IV,然后...
第二个将最终对您制作的备份副本进行加密,最后一个将它们复制到某个地方(S3存储桶,本地文件系统等)。 tl; dr (可选)对数据库进行加密备份,然后通过FTP和Amazon S3上载(或仅将其保存在服务器中)。 安装 $ ...