当前位置: 首页 > 知识库问答 >
问题:

Ruby的Java加密/解密

西门旻
2023-03-14

我有Java代码片段负责加密和解密,需要在Ruby中转换。在这里张贴之前,我通过了4个链接,但没有运气。

AES-CBC-PKCS5Padding-Encrypt-in-Java-Decrypt-in-Ruby

AES-CBC-PKCS5Padding-在Ruby-for-Rails中实现

gist.github.com

Ruby中的对称加密算法

* 
    /**
     * 
     */
    package in.bets.gsm.util;

    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;

    import org.apache.commons.codec.binary.Base64;

    /**
     * @author VKatz
     *
     */
    public class SecurePath {

        /**
         * 
         */
        public SecurePath() {
            // TODO Auto-generated constructor stub
        }

        public static String key = "Bar12345Bar12345";
        public static String initVector = "RandomInitVector"; 

        public static String encrypt(String value) {
            try {
                IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
                SecretKeySpec [skeySpec][4] = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

                byte[] encrypted = cipher.doFinal(value.getBytes());
                System.out.println("encrypted string: "
                        + Base64.encodeBase64String(encrypted));

                return Base64.encodeBase64String(encrypted);
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            return null;
        }

        public static String decrypt(String encrypted) {
            try {
                IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
                SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

                byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));

                return new String(original);
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            return null;
        }

    public static void main(String[] args) {

            String encText = encrypt("abceeffslaj");

            System.out.println("Decripted text ::  " + decrypt("XZy6gJinORmH+LOiZL6/Jw=="));
        }

    }



Output: 
Simple Text ::  abceeffslaj
Encrypted  text ::  XZy6gJinORmH+LOiZL6/Jw==
Decripted Text ::  abceeffslaj

为了得到相同的结果,我编写了下面的代码

我的努力:红宝石

require "openssl"
require "base64"
require 'byebug'

include Base64

plain_text = "abceeffslaj"

cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv
cipher_text = cipher.update(plain_text) + cipher.final

cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.decrypt
cipher.key = key
cipher.iv = iv
decrypted_plain_text = cipher.update(cipher_text) + cipher.final

puts "AES128 in CBC mode"
puts "Key: " + urlsafe_encode64(key)
puts "Iv: " + urlsafe_encode64(iv)
puts "Plain text: " + plain_text
puts "Cipher text: " + urlsafe_encode64(cipher_text)
puts "Decrypted plain text: " + decrypted_plain_text
AES128 in CBC mode
Key: CJ-SNuUllNKl1vAllEazKg==
Iv: ZMb2W6K07oaAXuvoL8Ckpg==
Plain text: abceeffslaj
Cipher text: jyutt1ljXW9Xn-HFxpvcEg==
Decrypted plain text: abceeffslaj

共有1个答案

井修雅
2023-03-14

您需要使用Java示例中的IV和Key,而不是新的/random IV/Key:

require "openssl"
require "base64"
require 'byebug'

include Base64

plain_text = "abceeffslaj"

key = 'Bar12345Bar12345'
iv = 'RandomInitVector'

cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.encrypt
cipher.key = key
cipher.iv = iv
cipher_text = cipher.update(plain_text) + cipher.final

cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.decrypt
cipher.key = key
cipher.iv = iv
decrypted_plain_text = cipher.update(cipher_text) + cipher.final

puts "AES128 in CBC mode"
puts "Key: " + urlsafe_encode64(key)
puts "Iv: " + urlsafe_encode64(iv)
puts "Plain text: " + plain_text
puts "Cipher text: " + urlsafe_encode64(cipher_text)
puts "Decrypted plain text: " + decrypted_plain_text
 类似资料:
  • 我有一段Java代码,负责加密和解密,需要将其转换为Ruby。在这里发布之前,我通过了4个链接,但没有运气。 aes-cbc-pkcs5padding-encrypt-in-java-decrypt-in-ruby aes-cbc-pkcs5padding-implementation-in-ruby-for-rails 主旨github。通用域名格式 Ruby中的对称加密算法 为了得到相同的结果

  • 问题内容: 我正在尝试在java中加密数据并在ruby中解密数据。 我的代码是…用Java加密 结果是 我希望在Ruby中解密(加密的字符串) Ruby代码是…(错误) 我希望得到 但它返回错误 我认为问题是cipher.padding和key / iv的类型。但是我不知道如何完成红宝石代码。 请让我知道如何完成此代码。 谢谢。 问题答案: Ruby代码有两个问题。 首先,应该使用AES 128时

  • 问题内容: 我有一个使用第三方付款门户的在线电子商务网站。在第三方支付门户要求所有人开始使用具有其他支付参数的哈希键之前,支付门户一直工作良好。 现在的问题是,第三方支付门户网站仅提供了一页文档来实现哈希密钥。 这是提供的文档: 加密演算法 为了减轻数据传输和发布过程中的参数调整/修改,商家可以使用Telenor POC提供的哈希密钥对请求进行加密。该加密请求与主请求一起发送,然后在OPS端进行协

  • 这是提供的文件:- 加密算法 为了在传输和发布数据时减轻参数调整/修改,商家可以使用Telenor PoC提供的散列密钥加密请求。该加密请求与主请求一起发送,然后在OPS端对主请求进行协调,以检测参数是否更改。加密可以使用以下算法完成: Put(“StoreID”,“28”); Fields.Put(“OrderRefNum”,“11001”); Fields.Put(“ExpiryDate”,“

  • 本文向大家介绍一个简单的Ruby可逆加密解密类,包括了一个简单的Ruby可逆加密解密类的使用技巧和注意事项,需要的朋友参考一下 实现代码: 测试代码:  

  • 我加密的是对称的AES密钥,它加密我的实际数据,所以密钥长度是16字节。当简单的base64编码密钥时,一切都正常,所以我知道这个RSA加密有问题。 下面是我的iOS调用的一个示例: 下面是我的Java调用的一个示例: null 当我进行更多测试时,我看到了这个页面(http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/pkcs/pkcs1/rsa