Aes

為什麼 Ansible Vault 的 AES256 加密文件的密文不成比例地由“3”和“6”組成?

  • November 11, 2020

今天早上我正在加密一些 Ansible 機密,並註意到密文中似乎有很多 3 和 6。我做了一些頻率統計,發現是的,事實上,大約 40% 的數字是 3,超過 20% 是 6:

$ANSIBLE_VAULT;1.2;AES256;staging-swarm
65313330663061336263663766653361336535316363303035386461656265643262346238313962
3961353035636635663338633338616437353332343735390a346135346166613737343265623239
31343733663762613533306332626263366330313639356239316532643134383035333932316535
3766396161306433640a656638363338323636653933323064343431363530616637363035303938
35373235656264636134623030633430343435306336646330633739323430663763343366333733
33666663323466323463343732353533353833306537383936336662343161333137303763326534
353764373232326263353238623634623565

頻率計數:

3: 207
6: 114
5: 37
2: 35
4: 31
1: 25
0: 23
7: 19
9: 12
8: 11

這似乎適用於其他 Ansible 秘密,例如這個問題中的秘密,組合頻率計數:

3: 247
6: 145
2: 54
5: 42
4: 35
1: 26
9: 26
7: 25
0: 22
8: 22

這是底層 AES 密文字節的特性,還是 Ansible/Python 將二進制密文表示為數字字元串的方式?

這是底層 AES 密文字節的特性,還是 Ansible/Python 將二進制密文表示為數字字元串的方式?

它是如何表示二進制密文的人工製品。

它首先將二進制轉換為十六進制的 ASCII 表示,即將其轉換為數字“0”到“9”和“a”到“f”。然後,它將每個十六進制數字轉換為其兩位十六進製表示,即值“30”到“39”和“61”到“66”。

反向翻譯引用字元串的前 16 個字元:

6531333066306133

當轉換回 ASCII 時,這些是 8 個字元e130f0a3,這是實際二進制值的十六進製表示。

至於為什麼你看到的字元分佈:

  • 字元 3 是 62.5% 的編碼字節的第一位,是 12.5% 的編碼字節的第二位;因此預計總共會發生 37.5% 的時間
  • 字元 6 是 37.5% 的編碼字節的第一位,是 12.5% 的編碼字節的第二位;因此預計會發生 25% 的時間。
  • 任何字元 1、2、4、5 是 12.5% 的編碼字節的第二個數字,因此預計會出現 6.25% 的時間。
  • 字元 0、7、8、9 中的任何一個都是 6.25% 的編碼字節的第二個數字,因此它們預計會出現 3.125% 的時間。

這些大致就是您所看到的(儘管第二個範例與這些預期的統計數據不那麼接近;我不確定為什麼會這樣)

引用自:https://crypto.stackexchange.com/questions/86085