Here is the main.c file for AES CTR - /examples/crypto/nrf_crypto/aes/aes_ctr example project
'NORDIC SEMICONDUCTORAES&MAC TEST' is the key
Encrypted hex output: "12 DD C3 EE DF 6E 7E 04 C7 3B DD 0D A3 F5 8E 7E CF 6D A0 A6 76 60 8A 63 01 87 A5 F6 F6 26 B6 86 3A 07 B3 C0 FE D3 E5 3E 94 95 D5 05 EA 62 E7 23 4A F8 9A 20 4C 68 B2 2C D6 E5"
In plain text it is - "Example string to demonstrate basic usage of AES CTR mode."
Here is my code for decrypting the message in python using the above key. https://gist.github.com/neelratanguria/f5e86bc4594882760013a2d19acf7e9e
from Crypto.Cipher import AES # Hex prints from debug console from segger nrf_plain_hex = "45 78 61 6D 70 6C 65 20 73 74 72 69 6E 67 20 74 6F 20 64 65 6D 6F 6E 73 74 72 61 74 65 20 62 61 73 69 63 20 75 73 61 67 65 20 6F 66 20 41 45 53 20 43 54 52 20 6D 6F 64 65 2E" nrf_cipher = "12 DD C3 EE DF 6E 7E 04 C7 3B DD 0D A3 F5 8E 7E CF 6D A0 A6 76 60 8A 63 01 87 A5 F6 F6 26 B6 86 3A 07 B3 C0 FE D3 E5 3E 94 95 D5 05 EA 62 E7 23 4A F8 9A 20 4C 68 B2 2C D6 E5" # Initiat vector for aes_ctr project iv = "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" # Method for converton of of hex string from NRF to bytes in python def nrf_hex_str_to_bytes(m_hex_str): split_nrf_plain_hex = x = m_hex_str.split(' ') split_nrf_plain_hex = "".join(split_nrf_plain_hex) return bytes.fromhex(split_nrf_plain_hex) # Convert plain text to bytes def str_to_byte(plain_key): return str.encode(plain_key) # Convert Hex string from segger's debug console to python bytes, verifying decoding in python pl_text = nrf_hex_str_to_bytes(nrf_plain_hex) # Print Hex string from segger's debug console to python bytes, verifying decoding in python print(pl_text) # Convert cihper hex string from segger's debug console to python bytes object encrypted_byte = nrf_hex_str_to_bytes(nrf_cipher) # Convert 16 bytes IV to python bytes object iv_byte = nrf_hex_str_to_bytes(iv) # Secret used for encryption in nRF AES CTR project plain_key = 'NORDIC SEMICONDUCTORAES&MAC TEST' # Convert secret string to python bytes object key_byte = str_to_byte(plain_key) # Create instance of Mode of operation crypto = AES.new(key_byte, AES.MODE_CTR, counter=lambda: iv_byte) # Decrypte cipher text plaintext = crypto.decrypt(encrypted_byte) # Print cipher text print(plaintext)
I figured out that IV is 16 bytes of 0. i.e. "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00". This is what I am using a counter in python code base.
The problem is the application works fine for any encrypted generated from an AES python app, but it is unable for to successfully decrypt the above encrypted message from nRF output.
I realized that in nRF project the message is being encrypted in two part and then are joined. First 10 bytes is encrypted first, then rest of the message is encrypted.
I tried decrypting with the same logic by decrypting 10 bytes of the message first separately. But still the message is not being decrypted properly.