レール暗号化/復号化

私は私のレールアプリで暗号化と復号化を行う必要があります。私はezcryptoを使用しようとしていますが、私はいつでも私はこのエラーを取得します。

OpenSSL::Cipher::CipherError in ProfilesController#show

wrong final block length

このエラーを停止するには、何を変更する必要がありますか。私はこのようなopensslの別の実装を使ってみました(私のモデルから呼び出されるメソッド)

def encrypt_attr(unencrypted)
    c = OpenSSL::Cipher.new("aes-256-cbc")
    c.encrypt
    c.key = Digest::SHA1.hexdigest('pass')
    e = c.update(unencrypted)
    e << c.final
    return e
end

def decrypt_attr(encrypted_attr)
  if encrypted_attr != ""
    c = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
    c.decrypt
    c.key = Digest::SHA1.hexdigest('pass')
    d = c.update(encrypted_attr)
    d << c.final
    return d
  end
end

それは解読時に全く同じエラーを投げます。どのように暗号化と復号化を行い、このopensslエラーを取得しないのですか?

5
私のために働く。 encrypt_attr メソッドから encrypted_attr != e を選択した場合にのみ、このエラーが発生します。この場合、 decrypt_attr メソッドでレスキューを使用する必要があります
追加された 著者 Vasiliy Ermolovich,
あなたが初期化ベクトルはどこですか?暗号ブロック連鎖を使用している場合は、@ジャック、好奇心から、? 5.3、初期化ベクトル、 csrc.nist.gov/publications/を参照してください。 nistpubs/800-38a/sp800-38a.pdf
追加された 著者 buruzaemon,
うーん、私の悪い、あなたは c.key に同じキーを持っています
追加された 著者 Thong Kuah,

3 答え

require 'openssl'
require 'base64'

class AesEncryptDecrypt

  KEY = "EncryptDecryptGurudathBN"
  ALGORITHM = 'AES-128-ECB'

  def self.暗号化(msg)
    begin
      cipher = OpenSSL::Cipher.new(ALGORITHM)
      cipher.encrypt()
      cipher.key = KEY
      crypt = cipher.update(msg) + cipher.final()
      crypt_string = (Base64.encode64(crypt))
      return crypt_string
    rescue Exception => exc
      puts ("Message for the 暗号化 log file for message #{msg} = #{exc.message}")
    end
  end

  def self.復号化(msg)
    begin
      cipher = OpenSSL::Cipher.new(ALGORITHM)
      cipher.decrypt()
      cipher.key = KEY
      tempkey = Base64.decode64(msg)
      crypt = cipher.update(tempkey)
      crypt << cipher.final()
      return crypt
    rescue Exception => exc
      puts ("Message for the 復号化 log file for message #{msg} = #{exc.message}")
    end
  end
end

暗号化

irb(main):007:0> AesEncryptDecrypt.暗号化('gurudath')
=> "rUPKObydUJd9cY9agm3Glw==\n"

復号化

irb(main):008:0> AesEncryptDecrypt.復号化('rUPKObydUJd9cY9agm3Glw==')
=> "gurudath"
13
追加された
パディングメカニズムとは何か、上記のプログラムでPKCS5Paddingを使用してデータを暗号化する方法
追加された 著者 CodecPM,
Iamは同じアルゴリズムを使用していますが、私の鍵はOpenSSL :: PKey :: RSA型です。 cipher.keyとしてkeyを設定すると、 OpenSSL :: PKey :: RSAを暗黙的にStringに変換しません = KEY
追加された 著者 CodecPM,

私は、Rubyの openssl パッケージのドキュメントがあまりにも少ないことを知っています。ただし、暗号ブロックチェーンを使用する場合は、 AES-256-CBC 暗号の使用方法の概要を示す簡単なコードスニペットを以下に示します。

require 'openssl'

# your data
raw  = 'the data to be encrypted goes here'
pwd  = 'secret'
salt = OpenSSL::Random.random_bytes(8)

# prepare cipher for encryption
e = OpenSSL::Cipher.new('AES-256-CBC')
e.encrypt
# next, generate a PKCS5-based string for your key + initialization vector 
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pwd, salt, 2000, e.key_len+e.iv_len)
key = key_iv[0, e.key_len]
iv  = key_iv[e.key_len, e.iv_len]

# now set the key and iv for the encrypting cipher
e.key = key
e.iv  = iv

# encrypt the data!
encrypted = '' << e.update(raw) << e.final
p encrypted

# and now we prepare to decrypt
d = OpenSSL::Cipher.new('AES-256-CBC')
d.decrypt
# now set the key and iv for the decrypting cipher
# this assumes that the password, salt, and iv are known,
# so then you would be able to generate the key as per above
d.key = key
d.iv  = iv

# decrypt the data!
decrypted = '' << d.update(encrypted) << d.final
p decrypted

このスニペットは、日本語( openssl にあるRuby標準ライブラリドキュメントのオリジナル版です)。ただし、あなたとアプリケーションの設計にはいくつかの質問があります。

  1. salt の値を保存する必要があります。これはパスワードと共に使用され、キーを生成します(キーを保存する必要はありません)。
  2. iv 初期化ベクトルを保存する必要があります。これは、暗号ブロックチェーンの最初のブロックを開始するために使用されます。この値を暗号化する必要はありませんが、暗号化するメッセージごとにこの値を生成する必要があります。

がんばろう!

2
追加された

私はあなたと同じ問題を抱えていました。これが私がそれを解決した方法です:

  1. Your database column has to be: t.column :data, :binary, :limit => 10.megabyte.
  2. Use the exact code as this blog post.
  3. Choose AES-256-ECB
  4. Leave ivs as nil
  5. Choose a long key
0
追加された