//加密
public IBuffer CipherEncryption(
String strMsg,
String strAlgName,
UInt32 keyLength,
out BinaryStringEncoding encoding,
out IBuffer iv,
out CryptographicKey key)
{
// Initialize the initialization vector.
iv = null;
// Initialize the binary encoding value.
encoding = BinaryStringEncoding.Utf8;
// Create a buffer that contains the encoded message to be encrypted.
IBuffer buffMsg = CryptographicBuffer.ConvertStringToBinary(strMsg, encoding);
// Open a symmetric algorithm provider for the specified algorithm.
SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(strAlgName);
// Demonstrate how to retrieve the name of the algorithm used.
String strAlgNameUsed = objAlg.AlgorithmName;
// Determine whether the message length is a multiple of the block length.
// This is not necessary for PKCS #7 algorithms which automatically pad the
// message to an appropriate length.
if (!strAlgName.Contains("PKCS7"))
{
if ((buffMsg.Length % objAlg.BlockLength) != 0)
{
throw new Exception("Message buffer length must be multiple of block length.");
}
}
// Create a symmetric key.
//IBuffer keyMaterial = CryptographicBuffer.GenerateRandom(keyLength);
IBuffer keyMaterial = CryptographicBuffer.CreateFromByteArray(System.Text.Encoding.UTF8.GetBytes(SECRET_KEY));
key = objAlg.CreateSymmetricKey(keyMaterial);
// CBC algorithms require an initialization vector. Here, a random
// number is used for the vector.
if (strAlgName.Contains("CBC"))
{
iv = CryptographicBuffer.GenerateRandom(objAlg.BlockLength);
}
// Encrypt the data and return.
IBuffer buffEncrypt = CryptographicEngine.Encrypt(key, buffMsg, iv);
return buffEncrypt;
}
//解密
public string CipherDecryption(
String strAlgName,
IBuffer buffEncrypt,
IBuffer iv,
BinaryStringEncoding encoding,
CryptographicKey key)
{
// Declare a buffer to contain the decrypted data.
IBuffer buffDecrypted;
// Open an symmetric algorithm provider for the specified algorithm.
SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(strAlgName);
// The input key must be securely shared between the sender of the encrypted message
// and the recipient. The initialization vector must also be shared but does not
// need to be shared in a secure manner. If the sender encodes a message string
// to a buffer, the binary encoding method must also be shared with the recipient.
buffDecrypted = CryptographicEngine.Decrypt(key, buffEncrypt, iv);
// Convert the decrypted buffer to a string (for display). If the sender created the
// original message buffer from a string, the sender must tell the recipient what
// BinaryStringEncoding value was used. Here, BinaryStringEncoding.Utf8 is used to
// convert the message to a buffer before encryption and to convert the decrypted
// buffer back to the original plaintext.
String strDecrypted = CryptographicBuffer.ConvertBinaryToString(encoding, buffDecrypted);
return strDecrypted;
}
static byte[] BufferToBytes(IBuffer buf)
{
using (var dataReader = DataReader.FromBuffer(buf))
{
var bytes = new byte[buf.Capacity];
dataReader.ReadBytes(bytes);
return bytes;
}
}
static IBuffer BytesToBuffer(byte[] bytes)
{
using (var dataWriter = new DataWriter())
{
dataWriter.WriteBytes(bytes);
return dataWriter.DetachBuffer();
}
}
//加密
BinaryStringEncoding encoding; // Binary encoding value
IBuffer iv; // Initialization vector
CryptographicKey key; // Symmetric key
IBuffer buffEncrypted = this.CipherEncryption(
await httpContent.ReadAsStringAsync(),
CIPHER_ALGORITHM_NAME,
(UInt32)(SECRET_KEY.Length),
out encoding,
out iv,
out key);
byte[] bytes = new byte[buffEncrypted.Capacity];
using (var dataReader = DataReader.FromBuffer(buffEncrypted))
{
dataReader.ReadBytes(bytes);
}
//base64
string base64 = Convert.ToBase64String(bytes);
Debug.WriteLine("Base64:" + base64);