11

PyCryptoを使用していますが、データの復号化に成功しているようです。ただし、受け取った文字列は奇妙に動作するようです。

...
plaintext = cipher.decrypt(encrypted)
print 'plaintext length is %u' % len(plaintext)
print 'plaintext: %s' % plaintext
print 'plaintext is "%s"' % plaintext

平文には私が期待する文字列( "POEorOPE")がありますが、出力は奇妙に見えます:

plaintext length is 16
plaintext: POEorOPE
plaintext is ""OEorOPE

3番目のprintステートメントの文字列がゼロのスペースを占めるように見えるのに、最初の文字が最後の引用であると思ったもので上書きされるのはなぜですか?私が今平文で保存しているもので他に何か起こっていることはありますか?

編集:

コメントありがとうございます、何が起こっているのかわかります。(文字列にバックスペース文字が含まれている理由はわかりませんが。)

print repr(plaintext)

'POEorOPE\x08\x08\x08\x08\x08\x08\x08\x08'
4

2 に答える 2

3

一部の (非常に古い) ソフトウェアは、「文字を 2 倍にする」ことによって太字のテキストをエミュレートするための気の利いたトリックを使用していました。複製により、より大きく、より暗いグリフが生成されます。

文字列は 8 文字である必要がありますが、len が 16 と表示されています。これは、8 つの Unicode コード ポイント (「\x08」) が追加されたためです (おそらく、復号化プロセスの一部として)。

Unicode ポイント "\x08" は実際にはバックスペースを表します。これらが単に無意味な Unicode ポイントであることを説明するには:

>>> u = u'POEorOPE\x08\x08\x08\x08\x08\x08\x08\x08'
>>> print u.encode()
POEorOPE
于 2013-03-24T22:42:19.320 に答える
1

これらのバックスペース文字は、Perl の Crypt::CBC モジュールによって追加されたバイト パディングであることが判明しました。この特定のケースでは、パディング バイトはすべて「08」で、削除する必要があるパディングが 8 バイトあることを示しています。PyCrypto は、復号化または暗号化中にパディングを処理しません。次のようにパディング バイトを取り除くことができます。

text_bytes = bytearray(plaintext,'utf-8')
num_bytes_padding = text_bytes[len(text_bytes) - 1]
text_bytes[-1 * num_bytes_padding:] = []
plaintext = text_bytes.decode('utf-8') 
于 2013-03-25T20:32:23.453 に答える