2016-06-15 30 views
1

私はRubyの新機能です。この質問が単純ならば謝ります。私は、キーを使用して文字列を暗号化するように、レールアプリケーションを更新する必要があります。これはdjangoで書かれたapiに渡され、暗号化された文字列は同じキーを使って解読されます。私はPythonで次のコードを持っていますが、Rubyで関連するメッセージを暗号化する方法がわかりません。どんな助けもありがとう。Rubyで文字列を暗号化し、Pythonで復号化する

import base64 
from Crypto.Cipher import AES 
from Crypto import Random 

class AESCipher: 
    def __init__(self, key): 
     self.key = key 

    def encrypt(self, raw): 
     raw = pad(raw) 
     iv = Random.new().read(AES.block_size) 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return base64.b64encode(iv + cipher.encrypt(raw)) 

    def decrypt(self, enc): 
     enc = base64.b64decode(enc) 
     iv = enc[:16] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return unpad(cipher.decrypt(enc[16:])) 
+0

私はそれが毎日のルビーユーザーにとって本当に簡単な質問ではないと思います。暗号化/復号化を下位のシステムに委譲する方が簡単かもしれません(つまりシェルコマンドを実行する)。そうすれば、RubyとPythonの両方で同じAPIを使用できます。 –

+0

答えが更新され、あなたの質問に完全に答える必要があります。 –

答えて

1

ArtjomBのフィードバックの後、私は提案されたライブラリをより深く見ていきました。それは、ルビーのオープンルーの周りの薄い包みです。だから、自分でAESCipherのルビー版を書くことができます。 それは右の方法を見つけるためにいくつかのあいと研究をした:私のテストケースで

require 'base64' 
require 'securerandom' 
require 'openssl' 

class AESCipher 
    attr_reader :key 

    def initialize(key) 
    @key = key 
    end 

    def encrypt(raw) 
    iv = SecureRandom.random_bytes(16) 
    cipher = build_encription_cipher(iv) 
    encrypted = cipher.update(raw) + cipher.final 
    Base64.encode64(iv + encrypted) 
    end 

    def decrypt(data) 
    data = Base64.decode64(data) 
    iv, raw = data[0..15], data[16..-1] 
    cipher = build_decrypt_cipher(iv) 
    cipher.update(raw) + cipher.final 
    end 

    private 

    def build_encription_cipher(iv) 
    OpenSSL::Cipher::AES.new(128, :CBC).tap do |cipher| 
     cipher.encrypt 
     cipher.key = key 
     cipher.iv = iv 
     cipher.padding = 0 
    end 
    end 

    def build_decrypt_cipher(iv) 
    OpenSSL::Cipher::AES.new(128, :CBC).tap do |cipher| 
     cipher.decrypt 
     cipher.key = key 
     cipher.iv = iv 
     cipher.padding = 0 
    end 
    end 
end 

のpythonとその逆で暗号化された文字列を復号化されたRubyのバージョンを。

(私はあなたのpythonコードに1つの修正を加えました:padへの呼び出しを削除します。私はそれがどうかわからないので、16の倍数の長さの文字列を使用しました)。

答えはで、colinmAES Python encryption and Ruby encryption - different behaviour?で非常に役に立ちました。