8

私は暗号化に非常に慣れていません。単純な文字列'ABC123'をそれに似たものにエンコードする必要があり'3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d'ます。

私は最初にこれを試しました:

>>> import base64
>>> q = 'ABC123'
>>> w = base64.encodestring(q)
>>> w
'QUJDMTIz\n'

しかし、それは短すぎるので、これを試したよりも長いものが必要です:

>>> import hashlib
>>> a = hashlib.sha224(q)
>>> a.hexdigest()
'3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d'

これは良いのですが、元に戻す方法がわかりません。誰かがこの例で私を助けたり、何か他のことを提案したりできるなら、小さな文字列をより長いものにエンコード/デコードする方法は素晴らしいでしょう.

アップデート

plockc答えに基づいて、私はこれを行いましたが、うまくいくようです:

from Crypto.Cipher import AES # encryption library

BLOCK_SIZE = 32

# the character used for padding--with a block cipher such as AES, the value
# you encrypt must be a multiple of BLOCK_SIZE in length.  This character is
# used to ensure that your value is always a multiple of BLOCK_SIZE
PADDING = '{'

# one-liner to sufficiently pad the text to be encrypted
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

# one-liners to encrypt/encode and decrypt/decode a string
# encrypt with AES, encode with base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

# create a cipher object using the random secret
cipher = AES.new('aaaaaaaaaa123456')

# encode a string
encoded = EncodeAES(cipher, 'ABC123')
print 'Encrypted string: %s' % encoded

# decode the encoded string
decoded = DecodeAES(cipher, encoded)
print 'Decrypted string: %s' % decoded
4

1 に答える 1

4

パンドラの箱を開けたばかりなので、おそらくそれをどのように使用するのか、そしてその理由について詳しく説明する必要があります:)

エンコーディングは可逆的であり、データを他のもの (テキストしか使用できない場合の base 64 バイナリ データなど) に適合させるためにのみ使用する必要があります。ハッシュ (sha224 など) は可逆的ではありません。

ユーザーがパスワードを入力したことを確認したい場合は、それを(sha224などで)ハッシュして保存し、ユーザーがパスワードを再度入力すると、エントリをハッシュして比較します。これは単純化されたバージョンです。単純な「辞書攻撃」を避けるために「salt」も追加する必要があります。それはあなたが尋ねた質問ではなかったので、私は詳しく説明しません。

質問にすばやく答えるには、暗号化ライブラリ (暗号 AES-128 など) が必要です。これには秘密鍵があり、その鍵を使用して元のデータを復元できます。キーの作成方法については、ライブラリに詳細が記載されています (キーは特定の長さである必要があり、その長さになるように操作されます)。キーが単純なパスワードに基づいている場合は、弱いパスワードから強力な暗号化キーを作成する PBKDF2 を調べてください。

hmac を暗号化と混同しないでください (hmac は、ハッシュ関数 sha224 などの別の関数を使用します)。メッセージの受信者が送信者と hmac キーを共有する場合、メッセージが送信者からのものであることを「認証」できます。変更なし。

幸運を!

PS: 本当に掘り下げたい場合は、ここに良い本があります: 暗号工学: 設計原則と実用的なアプリケーション

関連する一般的な回答: https://stackoverflow.com/a/4948393/1322463

ウィキペディアにも良い記事があります。

于 2013-07-08T20:25:12.547 に答える