using System; namespace XFEExtension.XEAEncryption { /// /// XEA加密算法 /// public static class XEAEncryption { /// /// 进行XEA加密 /// /// 待加密文本 /// 加密秘钥 /// 加密文本 public static string XEAEncrypt(string waitEncryptString, string secretKey) { string randomSeed = StringExtension.StringExtension.GenerateRandomString(5); string encryptedRandomSeed = string.Empty; string encrypted = string.Empty; string middleKey = string.Empty; char middleChar = ' '; for (int i = 0; i < secretKey.Length / 2; i++) { middleChar ^= secretKey[i]; middleKey += (char)(secretKey[i] ^ secretKey[secretKey.Length - i - 1]); }//计算中间密钥,防止出现秘钥长度大于待加密文本长度的情况 for (int i = 0; i < randomSeed.Length; i++) { char currentChar = randomSeed[i]; int secretKeyIndex = i % secretKey.Length; int middleKeyIndex = i % middleKey.Length; char secretKeyChar = secretKey[secretKeyIndex]; char middleKeyChar = middleKey[middleKeyIndex]; char encryptedChar = (char)(currentChar ^ secretKeyChar ^ middleKeyChar ^ middleChar); encryptedRandomSeed += encryptedChar; }//对随机种子进行加密 for (int i = 0; i < waitEncryptString.Length; i++) { char currentChar = waitEncryptString[i]; int secretKeyIndex = i % secretKey.Length; int middleKeyIndex = i % middleKey.Length; int randomSeedIndex = i % randomSeed.Length; char secretKeyChar = secretKey[secretKeyIndex]; char middleKeyChar = middleKey[middleKeyIndex]; char randomSeedChar = randomSeed[randomSeedIndex]; char encryptedChar = (char)(currentChar ^ secretKeyChar ^ middleKeyChar ^ randomSeedChar ^ middleChar); encrypted += encryptedChar; }//XOR加密 return encryptedRandomSeed + encrypted; } /// /// 进行XEA解密 /// /// 加密文本 /// 解密秘钥 /// 解密文本 public static string XEADecrypt(string encryptedString, string secretKey) { string decrypted = string.Empty; string randomSeed = encryptedString.Substring(0, 5); string decryptedRandomSeed = string.Empty; string encrypted = encryptedString.Substring(5); string middleKey = string.Empty; char middleChar = ' '; for (int i = 0; i < secretKey.Length / 2; i++) { middleChar ^= secretKey[i]; middleKey += (char)(secretKey[i] ^ secretKey[secretKey.Length - i - 1]); }//计算中间密钥 for (int i = 0; i < randomSeed.Length; i++) { char currentChar = randomSeed[i]; int secretKeyIndex = i % secretKey.Length; int middleKeyIndex = i % middleKey.Length; char secretKeyChar = secretKey[secretKeyIndex]; char middleKeyChar = middleKey[middleKeyIndex]; char encryptedChar = (char)(currentChar ^ secretKeyChar ^ middleKeyChar ^ middleChar); decryptedRandomSeed += encryptedChar; }//对随机种子进行解密 for (int i = 0; i < encrypted.Length; i++) { char currentChar = encrypted[i]; int secretKeyIndex = i % secretKey.Length; int middleKeyIndex = i % middleKey.Length; int randomSeedIndex = i % decryptedRandomSeed.Length; char secretKeyChar = secretKey[secretKeyIndex]; char middleKeyChar = middleKey[middleKeyIndex]; char randomSeedChar = decryptedRandomSeed[randomSeedIndex]; char decryptedChar = (char)(currentChar ^ secretKeyChar ^ middleKeyChar ^ randomSeedChar ^ middleChar); decrypted += decryptedChar; }//XOR解密 return decrypted; } } /// /// XEA加密算法的拓展 /// public static class XEAEncryptionExtension { /// /// 进行XEA加密 /// /// 待加密文本 /// 加密秘钥 /// 加密文本 public static string XEAEncrypt(this string waitEncryptString, string secretKey) { return XEAEncryption.XEAEncrypt(waitEncryptString, secretKey); } /// /// 进行XEA解密 /// /// 加密文本 /// 解密秘钥 /// 解密文本 public static string XEADecrypt(this string encryptedString, string key) { return XEAEncryption.XEADecrypt(encryptedString, key); } } }