【问题标题】:how to encrypt data with AES 256 ECB PKCS5Padding in ruby如何在 ruby​​ 中使用 AES 256 ECB PKCS5Padding 加密数据
【发布时间】:2017-04-07 05:02:26
【问题描述】:

我想使用 PKCS5padding 以 AES 256 位 ECB 模式加密数据 我的ruby方法如下,这里如何使用PKCS5Padding

def encrypt(raw_data,key)
  cipher = OpenSSL::Cipher::AES.new(256, :ECB)
  cipher.encrypt
  cipher.key = key
  encrypted_data = cipher.update(raw_data) + cipher.final
end

这里的key是OpenSSL::PKey::RSA类型,抛出no implicit conversion of OpenSSL::PKey::RSA into String异常

【问题讨论】:

  • 在加密之前尝试 Base64.encode64(raw_data),我认为您正在尝试加密 RSA 密钥,对吗?
  • 您可以使用 cipher.random_key 作为密钥,因为它不接受字符串以外的其他格式
  • 我需要从 .cer 文件中提取公钥,然后数据必须使用从 .cer 文件中获得的公钥进行加密,为此我关注了stackoverflow.com/a/1914928/4477305@Wish Zone
  • 这样做之后你是不是想用私钥解密数据??

标签: ruby-on-rails ruby encryption openssl aes


【解决方案1】:

我认为您的密钥格式错误。您正在尝试传递一个 RSA 密钥,而该密钥应该只是一个哈希字符串......类似于:

key = SecureRandom.hex(32)
=> "b67f7a5bf031aaa730473e5a9612a94b157c43aed5f52a2e70c9573f2d5a4ecd" 

【讨论】:

    【解决方案2】:

    你应该使用

    key = cipher.random_key
    

    而不是 RSA 密钥

    我已按照以下方式使用它来达到我的目的

    1. 生成密码随机密钥
    2. 使用这些密钥对数据进行 AES 加密
    3. 在提供密钥之前使用 RSA 公钥对其进行加密

    在接收端

    1. 使用 RSA 私钥解密密码密钥
    2. 使用生成的密码密钥解密数据

    注意:我们不能使用基于 RSA 私钥/公钥的技术加密大数据

    Super secured Example
    
      # At sender side
      public_key_file = 'public.pem'
    
      message = 'Hey vishh you are awesome!!'
      cipher = OpenSSL::Cipher::AES.new(128, :CBC)
      cipher.encrypt
      aes_key = cipher.random_key
      encrypted_data = cipher.update(message) + cipher.final
      # encrypted_data is ready to travel
    
      rsa = OpenSSL::PKey::RSA.new(File.read(public_key_file))  
      rsa_cypher_key = rsa.public_encrypt(aes_key)
      # rsa_cypher_key is ready to travel
    
      # sending these data in encoded format is good idea
      encrypted_data = Base64.encode64(encrypted_data)
      rsa_cypher_key = Base64.encode64(rsa_cypher_key) 
      ====> encrypted_data + rsa_cypher_key =====> Travelling
      encrypted_data = Base64.decode64(encrypted_data)
      rsa_cypher_key = Base64.decode64(rsa_cypher_key) # decode the data
    
      # At recevier side
      private_key_file = 'private.pem'
      # Decrypt the cypher key with private key
      rsp = OpenSSL::PKey::RSA.new(File.read('./config/private.pem'))
      aes_key = private_key.private_decrypt(rsa_cypher_key)
    
      decipher = OpenSSL::Cipher::AES.new(128, :CBC)
      decipher.decrypt
      decipher.key = aes_key
      message = decipher.update(encrypted_data) + decipher.final
      p message
      'Hey vishh you are awesome!!'
    

    【讨论】:

    • 这个过程中如何使用PKCS5Padding,默认的padding是什么?
    • @CodecPM 嘿,我已经编辑了答案以寻求帮助,现在是时候摇滚了!
    • @CodecPM 默认填充是 PKCS1_PADDING
    猜你喜欢
    • 2017-11-11
    • 2012-03-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2021-01-19
    • 2022-11-16
    • 2012-11-22
    相关资源
    最近更新 更多