查看@TheTanic发布的答案解决方案:UWP: AES encryption and decryption
CryptTest示例是一个巨大的帮助。它适用于简单的字符串。我正在阅读PDF文件,有些字符没有正确加密/解密。例如,原始文件阵列上的字节10到13在加密之前具有值226,227,207,211。一旦我调用加密然后解密(使用相同的密钥和IV),它们应该是相同的(并且大多数值都是)但是字节10到13都是63.不用说,生成的PDF具有正确的数字页面,但没有内容。文件大小是准确的。我正在阅读的文件是在Windows存储中。这里需要一些想法。
我正在使用此代码读取加密方法调用的输入参数的文件,然后使用该结果调用Decrypt方法。
byte[] toEncrypt = File.ReadAllBytes(filename);
byte[] Encrypted = endecryption.Encrypt(toEncrypt);
byte[] Decrypted = endecryption.Decrypt(Encrypted);
以下是上面链接的示例代码,以便于参考。
using System;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
namespace CryptTest
{
public class AesEnDecryption
{
// Key with 256 and IV with 16 length
private string AES_Key = "Y+3xQDLPWalRKK3U/JuabsJNnuEO91zRiOH5gjgOqck=";
private string AES_IV = "15CV1/ZOnVI3rY4wk4INBg==";
private IBuffer m_iv = null;
private CryptographicKey m_key;
public AesEnDecryption()
{
IBuffer key = Convert.FromBase64String(AES_Key).AsBuffer();
m_iv = Convert.FromBase64String(AES_IV).AsBuffer();
SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
m_key = provider.CreateSymmetricKey(key);
}
public byte[] Encrypt(byte[] input)
{
IBuffer bufferMsg = CryptographicBuffer.ConvertStringToBinary(Encoding.ASCII.GetString(input), BinaryStringEncoding.Utf8);
IBuffer bufferEncrypt = CryptographicEngine.Encrypt(m_key, bufferMsg, m_iv);
return bufferEncrypt.ToArray();
}
public byte[] Decrypt(byte[] input)
{
IBuffer bufferDecrypt = CryptographicEngine.Decrypt(m_key, input.AsBuffer(), m_iv);
return bufferDecrypt.ToArray();
}
}
}
答案 0 :(得分:0)
您在输入上调用Encoding.ASCII.GetString()
。这对二进制数据无效,加密或解密时不需要(加密是对二进制数据而不是ASCII字符串执行的。)
127以上的值无法编码为ASCII,看起来它们正在转换为?
(63)。
删除“将其转换为ASCII,然后将其重新设置为二进制”步骤,它应该可以正常工作。