4

我正在尝试使用 Python 生成一个字符串,然后encrypt使用Ruby 生成结果,但是字符串被弄乱了。base64_encodebase64_decodedecrypt

我看不出这两种方法有什么区别。我尝试使用 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 方面,您应该删除填充。

红宝石部分(解码):

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

或者,您可以使用 M2Crypto,它不需要删除 Ruby 端的填充:

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 回答