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