В прошлой статье я рассказывал про то, как применять шифрование AES на STM8L. Но во многих случаях данные нужно будет шифровать на PC, и отправлять в МК, поэтому сейчас я расскажу, как это делать. На PC я знаю только C#, потому и буду использовать его.
В .net framework есть готовый класс для шифрования, поддерживающий несколько алгоритмов, в том числе и AES
Создадим новый проект C# в VisualStudio, и добавим в него:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | using System.Security.Cryptography; using System.IO; //вектор инициализации static byte[] IV = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //ключ шифрования static byte[] key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 }; public static byte[] Encrypt(byte[] ENC, byte[] AES_KEY, byte[] AES_IV) { using (Rijndael AES = Rijndael.Create()) { AES.KeySize = 128; AES.BlockSize = 128; AES.Padding = PaddingMode.None; MemoryStream MS = new MemoryStream(); CryptoStream CS = new CryptoStream(MS, AES.CreateEncryptor(AES_KEY, AES_IV), CryptoStreamMode.Write); CS.Write(ENC, 0, ENC.Length); CS.Close(); return MS.ToArray(); } } public static byte[] Decrypt(byte[] DEC, byte[] AES_KEY, byte[] AES_IV) { using (Rijndael AES = Rijndael.Create()) { AES.KeySize = 128; AES.BlockSize = 128; AES.Padding = PaddingMode.None; MemoryStream MS = new MemoryStream(); CryptoStream CS = new CryptoStream(MS, AES.CreateDecryptor(AES_KEY, AES_IV), CryptoStreamMode.Write); CS.Write(DEC, 0, DEC.Length); CS.Close(); return MS.ToArray(); } } |
Всё, можно кодировать и декодировать данные,делать это очень просто
1 2 3 4 5 6 7 8 9 10 11 12 13 | //объявим буфер byte[] Buffer = new byte[16]; //заполним буфер, чтоб не ноли шифровать for (int i = 0; i < 16; i++) { Buffer[i] = (byte)i; } //шифруем Buffer = Encrypt(Buffer, key, IV); //дешифруем Buffer = Decrypt(Buffer, key, IV); |
IV библиотека AVR-Crypto-Lib не поддерживает, так что оставляем его нулевым, а вот key модифицируем согласно своему ключу.
Ноябрь 2nd, 2013 on 7:30 пп
Хорошая статья, вот только стоит упомянуть об
AES.Padding = PaddingMode.None;
Из-за этого у новичков могут быть ошибки.