Ім'я файлу: Морозов Лаб4.docx Розширення: docx Розмір: 199кб. Дата: 06.12.2021 скачати Пов'язані файли: Звіт з практики.docx Міністерство освіти та науки України Національний університет «Львівська політехніка» Кафедра ЕОМ Лабораторна робота №4 з дисципліни: “Проектування засобів захисту інформації в комп'ютерних системах та мережах” на тему: “Комбіновані криптосистеми на прикладі цифрового конверта” Виконав студент групи КІКС-11 Грицик А. Я. Прийняв: Морозов Ю.В Львів 2020 Мета: реалізувати програму підтримки комбінованих криптосистем на прикладі цифрового конверта. Завдання В ході роботи необхідно засвоїти основні принципи побудови омбінованих криптосистем, розробити програму підтримки комбінованих криптосистем на прикладі цифрового конверта. Для спрощення реалізації розрядність відкритого та закритого ключів повинна складати до 64 біт. Текст програми using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Cast { public class Envelope { byte[] encodedCASTMessage; public void Reset() { rsaParmSessionKey.Exponent = null; rsaParmDigitalSignature.Exponent = null; } #region Main public DigitalEnvelopeModel GetEncryptedEnvelope(string text) { uint[] key = KeyGenerator(); string keyStr = GetStringFromKey(key); string encryptSessionKey = SessionKey(keyStr, true); string encryptText = MessageCoder(text, keyStr, true); string signature = CreateDigitalSignature(text); return new DigitalEnvelopeModel(encryptSessionKey, encryptText, signature); } public DigitalEnvelopeModel GetDecryptedEnvelope(DigitalEnvelopeModel envelope) { string sessionKeyStr = SessionKey(envelope.SessionKey, false); string decryptText = MessageCoder(envelope.Body, sessionKeyStr, false); bool signature = CheckDigitalSignature(decryptText, envelope.Signature); return new DigitalEnvelopeModel(sessionKeyStr, decryptText, (signature ? "Good" : "Bad") + " signature"); } #endregion #region MessageCoder private string MessageCoder(string text, string key128, bool encrypt) { string result; if (encrypt) { encodedCASTMessage = AcedCast5.EncryptString(text, key128); result = BitConverter.ToString(encodedCASTMessage).Replace("-", ""); } else { byte[] encodedByte = StringToByteArray(text); result = AcedCast5.DecryptString(encodedByte, key128); } return result; } #endregion #region Key Generator private uint[] KeyGenerator() { uint[] res = new uint[4]; Random random = new Random(); for (int i = 0; i < 3; i++) { res[i] = (uint)random.Next(0x70000000, 0x7fffffff); } return res; } private string GetStringFromKey(uint[] key) { StringBuilder keyStr = new StringBuilder(); foreach (var u in key) { keyStr.Append($"{u:X},"); } keyStr.Remove(keyStr.Length - 1, 1); return keyStr.ToString(); } private uint[] GetKeyFromString(string key) { List string[] partOfKey = key.Split(','); foreach (var s in partOfKey) { keyUint.Add(uint.Parse(s, NumberStyles.HexNumber)); } return keyUint.ToArray(); } #endregion public static byte[] StringToByteArray(String hex) { var result = new byte[(hex.Length + 1) / 2]; var offset = 0; if (hex.Length % 2 == 1) { // If length of input is odd, the first character has an implicit 0 prepended. result[0] = (byte)Convert.ToUInt32(hex[0] + "", 16); offset = 1; } for (int i = 0; i < hex.Length / 2; i++) { result[i + offset] = (byte)Convert.ToUInt32(hex.Substring(i * 2 + offset, 2), 16); } return result; } string Encryption(string data, ref RSAParameters RSAKeyInfo) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSA.ImportParameters(RSAKeyInfo); byte[] byteData = Encoding.UTF8.GetBytes(data); byte[] result = RSA.Encrypt(byteData, true); return BitConverter.ToString(result).Replace("-", ""); } string Decryption(string data, ref RSAParameters RSAKeyInfo) { try { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSA.ImportParameters(RSAKeyInfo); byte[] byteData = StringToByteArray(data); byte[] result = RSA.Decrypt(byteData, true); return System.Text.Encoding.UTF8.GetString(result, 0, result.Length); } catch(System.Security.Cryptography.CryptographicException e) { MessageBox.Show("Error in decryption"); return data; } } #region Session Key private RSAParameters rsaParmSessionKey; public string SessionKey(string data, bool encrypt) { if (rsaParmSessionKey.Exponent == null) { rsaParmSessionKey = new RSACryptoServiceProvider(1024).ExportParameters(true); } return encrypt ? Encryption(data, ref rsaParmSessionKey) : Decryption(data, ref rsaParmSessionKey); } #endregion #region Digital Signature private RSAParameters rsaParmDigitalSignature; public string CreateDigitalSignature(string data) { SHA1 sha1Hash = SHA1.Create(); byte[] sourceBytes = Encoding.UTF8.GetBytes(data); byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes); string hash = BitConverter.ToString(hashBytes); if (rsaParmDigitalSignature.Exponent == null) { rsaParmDigitalSignature = new RSACryptoServiceProvider(1024).ExportParameters(true); } return Encryption(hash, ref rsaParmDigitalSignature); } public bool CheckDigitalSignature(string data, string encryptData) { SHA1 sha1Hash = SHA1.Create(); byte[] sourceBytes = Encoding.UTF8.GetBytes(data); byte[] hashBytes = sha1Hash.ComputeHash(sourceBytes); string hash = BitConverter.ToString(hashBytes); if (rsaParmDigitalSignature.Exponent == null) { rsaParmDigitalSignature = new RSACryptoServiceProvider(1024).ExportParameters(true); } return Decryption(encryptData, ref rsaParmDigitalSignature) == hash; } #endregion } public class DigitalEnvelopeModel { public string SessionKey; public string Body; public string Signature; public DigitalEnvelopeModel(string encryptSessionKey, string encryptText, string signature) { this.SessionKey = encryptSessionKey; this.Body = encryptText; this.Signature = signature; } } } Рис. 1. Результат виконання програми Рис. 2. Діаграма класів Висновок: На цій лабораторній роботі було реалізвано програму підтримки комбінованих криптосистем на основі цифрового конверта. |