Aes
為什麼 Ansible Vault 的 AES256 加密文件的密文不成比例地由“3”和“6”組成?
今天早上我正在加密一些 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% 的時間。
這些大致就是您所看到的(儘管第二個範例與這些預期的統計數據不那麼接近;我不確定為什麼會這樣)