3

2 つのエンコーディングが同じデコーディングにマップできるのは、予想される動作ですか? base64 でエンコードされた中間文字列のサニティ チェックを実行して、デジタル署名の問題をトラブルシューティングしようとしています。

たとえば、次の base64 エンコーディング:

R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8=

と:

R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw==

どちらも次のようにデコードします。

GET


Fri, 04 Sep 2009 11:05:49 GMT+00:00
/

(文字をエスケープすると、次のようになりますGET\n\n\n Fri, 04 Sep 2009 11:05:49 GMT+00:00\n/:)

最初のエンコーディングは、2 つのオンライン base64 エンコーダーをテストした結果です。

2 番目のエンコーディングは、ここで入手できるObjective-C base64 エンコーダーから取得されます。

Obj-C エンコーダーで生成した結果に何か問題がありますか?

4

5 に答える 5

14

Python を使用して、文字列が等しくないことを証明する別の例:

>>> from base64 import decodestring as d
>>> a = "R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8="
>>> b = "R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw=="
>>> d(a)
'GET\r\n\r\n\r\nFri, 04 Sep 2009 11:05:49 GMT+00:00\r\n/'
>>> d(b)
'GET\n\n\nFri, 04 Sep 2009 10:33:28 GMT+00:00\n/'
>>> d(a) == d(b)
False

長い文字列は CRLF 改行を使用し、短い文字列は単純な LF を使用します。

于 2009-09-04T11:25:16.267 に答える
8

エンコードされた文字列のパターンは、英数字に対応する部分では類似しており、改行に対応する部分では異なることは明らかです。したがって、違いは、「エンコード」->「デコード」方法のどこかで、ソフトウェアが改行 (CR (\r)、LF(\n) または CRLF(\r\n)) を異なる方法で処理するためです。結果。

それ以外には、特定の文字列を Base64 にエンコードする 2 つの異なる方法はなく、有効な Base64 でエンコードされたデータをデコードする 2 つの異なる方法はありません。

于 2009-09-04T11:18:14.580 に答える
4

実際には、それらは同じものにデコードされません。

$ echo 'R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw==' | base64 -d | hexdump 
0000000 4547 0a54 0a0a 7246 2c69 3020 2034 6553
0000010 2070 3032 3930 3120 3a30 3333 323a 2038
0000020 4d47 2b54 3030 303a 0a30 002f          
000002b
$ echo 'R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8=' | base64 -d | hexdump
0000000 4547 0d54 0d0a 0d0a 460a 6972 202c 3430
0000010 5320 7065 3220 3030 2039 3131 303a 3a35
0000020 3934 4720 544d 302b 3a30 3030 0a0d 002f
000002f
于 2009-09-04T11:23:03.620 に答える
3

@sharptoothが示唆したように、改行は\r\n最初のものと\n2番目のものにあります。

>>> base64.b64decode("R0VUDQoNCg0KRnJpLCAwNCBTZXAgMjAwOSAxMTowNTo0OSBHTVQrMDA6MDANCi8=")
'GET\r\n\r\n\r\nFri, 04 Sep 2009 11:05:49 GMT+00:00\r\n/'
>>> base64.b64decode("R0VUCgoKRnJpLCAwNCBTZXAgMjAwOSAxMDozMzoyOCBHTVQrMDA6MDAKLw==")
'GET\n\n\nFri, 04 Sep 2009 10:33:28 GMT+00:00\n/'
于 2009-09-04T11:24:55.300 に答える
2

重要なのは、base 64 文字列が文字列ではなくバイト列にデコードされることです。ベース 64 文字列のそれぞれによって生成されたバイト配列を比較すると、違いは行終端の方法にあることがわかります. Unix 回線終端の違い。

于 2009-09-04T11:23:39.640 に答える