4

Python で文字列を取得し、 Ruby で結果encryptを取得しようとしているのですが、文字列がめちゃくちゃです。base64_encodebase64_decodedecrypt

2つの方法に違いはありません。128 ビットの AES-CFB アルゴリズムを使用してみましたが、成功しませんでした。

ここに私のPythonコードがあります:

from Crypto.Cipher import AES
from Crypto.Util.randpool import RandomPool
from base64 import standard_b64encode, standard_b64decode

key = "abcdefghijklmnop"
en = AES.new(key, AES.MODE_CFB, "0000000000000000")
cipher = en.encrypt("apple")
cipher64 = standard_b64encode(cipher)

cipher64内容:WqF9Zj0=

私のRubyコードは次のとおりです。

require "openssl"
require 'digest/sha2'
require 'base64'


de = OpenSSL::Cipher::Cipher.new("aes-128-cfb")
de.decrypt
de.key = "abcdefghijklmnop"
de.iv = "0000000000000000"
plain = de.update("WqF9Zj0=".unpack('m')[0])
de.final
puts plain

plainとは異なる文字列が含まれています"apple"。パディングの問題を避けるために、文字列の長さが 16 の場合も同じ結果が得られます。

パラメータの問題だと思いますが、何が原因かわかりません。誰にもアイデアはありますか?

4

1 に答える 1

1

PyCrypto は別のsegment_size

エンコード時に を指定segment_sizeし、平文をパディングします。

from base64 import standard_b64encode

from Crypto.Cipher import AES

def pad(x, n=16):
    p = n - (len(x) % n)
    return x + chr(p) * p

key = "abcdefghijklmnop"
en = AES.new(key=key, mode=AES.MODE_CFB, IV="0" * 16, segment_size=128)
cipher = en.encrypt(pad("apple"))
cipher64 = standard_b64encode(cipher)
print cipher64

上記のコードを使用すると、 が得られapple\x03\x03\x03ます。Ruby 側では、パディングを削除する必要があります。

Ruby 部分 (デコード):

require "openssl"

de = OpenSSL::Cipher::Cipher.new("aes-128-cfb")
de.decrypt
de.key = "abcdefghijklmnop"
de.iv = "0000000000000000"
plain = de.update(ARGV[0].unpack('m')[0]) + de.final
plain = plain[0...-plain[-1].ord]
puts plain

または、Ruby 側のパディングを削除する必要がない M2Crypto を使用できます。

from base64 import standard_b64encode

import M2Crypto.EVP

key = "abcdefghijklmnop"
iv = "0000000000000000"
en = M2Crypto.EVP.Cipher('aes_128_cfb', key, iv, 1)
cipher = en.update('apple') + en.final()
cipher64 = standard_b64encode(cipher)
print cipher64
于 2013-07-24T14:03:35.833 に答える