在多可文档系统中文件接口需要和其他系统实现用户统一登录,其他数据加密传输,要保障算法和数据的一致性 对系统接口使用有很大帮助。系统选择使用AES加密算法的CBC模式(128位密钥),实现各系统间加密数据的传输。多可提供各种语言的算法实现,以下是c#语言的具体算法实现(其他语言参考博主相关文章):
using System;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp1
{
class Program
{
public static string AesDecrypt(string encryptText, string key, string iv)
{
key = key.Substring(0, 16);
//
if (string.IsNullOrEmpty(encryptText)) return string.Empty;
if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
if (key.Length != 16 && key.Length != 24 && key.Length != 32) throw new Exception("指定的密钥长度不明确。");
if (!string.IsNullOrEmpty(iv))
{
if (iv.Length < 16) throw new Exception("指定的向量长度不能少于16位。");
}
var _valueByte = new byte[encryptText.Length / 2];
for (var x = 0; x < _valueByte.Length; x++)
{
var i = Convert.ToInt32(encryptText.Substring(x * 2, 2), 16);
_valueByte[x] = (byte)i;
}
using (var aes = new RijndaelManaged())
{
aes.IV = Encoding.UTF8.GetBytes(iv);
aes.Key = Encoding.UTF8.GetBytes(key);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Zeros;
var cryptoTransform = aes.CreateDecryptor();
var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
}
public static string AesEncrypt(string inText, string key, string iv)
{
key = key.Substring(0, 16);
//
if (string.IsNullOrEmpty(inText)) return string.Empty;
if (key == null) throw new Exception("未将对象引用设置到对象的实例。");
if (key.Length < 16) throw new Exception("指定的密钥长度不能少于16位。");
if (key.Length > 32) throw new Exception("指定的密钥长度不能多于32位。");
if (key.Length != 16 && key.Length != 24 && key.Length != 32) throw new Exception("指定的密钥长度不明确。");
if (!string.IsNullOrEmpty(iv))
{
if (iv.Length < 16) throw new Exception("指定的向量长度不能少于16位。");
}
Byte[] toEncryptArray = System.Text.Encoding.UTF8.GetBytes(inText);
using (var aes = new RijndaelManaged())
{
aes.IV = Encoding.UTF8.GetBytes(iv);
aes.Key = Encoding.UTF8.GetBytes(key);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.Zeros;
var cTransform = aes.CreateEncryptor();
var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
StringBuilder ret = new StringBuilder();
foreach (byte b in resultArray)
{
ret.AppendFormat("{0:x2}", b);
}
return ret.ToString();
}
}
static void Main(string[] args)
{
string iv = "1234567890ABCDEF"; //初始化向量
string key = "2018201820182018"; //16位密码,修改为设置后密码
string inText = "多可文档管理系统";
//outStr = 051a291770a6b4fbdb117d1f128c864433e6433a342cc822f7e27d75245d3c6e
var outStr = AesEncrypt(inText, key, iv);
Console.WriteLine(outStr);
//
var outStr2 = AesDecrypt(outStr, key, iv);
Console.WriteLine(outStr2);
}
}
}