我正在尝试解密一个文件,它是在Java程序加密的,据称使用AES-256 CBC与默认IV。
如果我使用通用解密方法(DecryptAesCbc),唯一的第一个块被成功解密。
如果我使用来自Java开发人员的建议解密方法(Decrypt),那么所有文本都被成功解密+末尾的一些附加字符(可能是padding?)。
工作示例:https://dotnetfiddle.net/m1zqbs
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
/*
Original text:
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
Alleged encryption algorithm: AES CBC 256bit key (default IV) - file was encrypted in Java program.
*/
public class Program
{
//BASE64 encoded cyphertext
public static string encryptedFileBase64 = "k+8W4j0bec7AlcuxQ017lcSuZesp6hroADqN6nsYfMJyvpzrPQEGplGvcWd9Th7buerMkkpXYRGXJm+J4rVdwxi8nMZkithPrweUpHn27I/Td1ETuVJDQCfo/3ZG0/Hya/zvvq+A8YOgreC1qDkg/ap/Wci7RfVdBD1RXzhrLLD6PcdyZW34AWwjvGAnqrR5KLBeGxT6txTjx/V9SR21rD5LLz12QB4g6A6nulLfZiOHKhRydr9XpJzbISjjAh8/RAGDQHtEwdvbWngH/c7zmrZDL1gsC9e7Ia2wLeTQXSQkb6DAeb7XFyjHObX099xeMpjT9ZnELe/W1eCayC881iEoIVsB1mQA8FktOxyPHwDqU0cLMDjpLtu/1BzW838nCZEKExCKeRjeEDDtixU+KLl/BtDCXMGKXQPPaJk8gK9Ytb7+KCE+h4qAatUBydqIu9wtULu6qsk08S7tWhYHdDJiBToyizogNSUgsLQt89ssLYeb2Iof/ybHDXGi8UlgUohSuvzARUffhtYtmm4cljO92XdS+6bPOX7oW4Od3jPldXOnITZyj95lD3pZf2ss3xIan8UZ3MJNyIvnVR/FGqF/lBxyNIcbRWaMXheb+QBKEQsmphSrbR5AMdo7GsTSw32o7wJ1dqBrK0Sl5fsUjtY4ivV88TWqkoSsyT1XczDK8IsOgXFBGp/NxDcBrQV0HyTkN7AchNdVj7b5LRDwBOKag4jGwb87pyFdCjtAEd4XdS7asvMOoEBQNSL/B0NXFqWB5SyFHhHZYK7ewT9P38zsB8zHxYDcfaSujwmaS5YOVw8/ltO3qQfy02zy/3K+";
//BASE64 encoded AES key
public static string aesKeyBase64 = "lAw0kowr1i//T6Bci78bRX/lIRIwwKeGUz4pHDz0jjo=";
public static string encryptedFileBase64_2 = "0S0tQ2jupE7bHbVspWCOOSWs/hEm/da+oFSVEU1XkzenZmb+OXWM7+4WUNAUU2hZ4IWJULl34Ha8pIb2btLOuv+KSOmFG5wX+rRMd2y66/HLDcHgOkZUPG3c+MV6261q3U2cFad6kZzRx1td3eXiD2vNljP1VKT1Fcr2c8sVVH2Fo1tQEm21YAjxgvcl3k6r6B0zigL1iAYH5liC65LQLihUyrcPLZ7vy2Wt2tKeFUE/kVXwX9/KHQEsY+j9HCE8zPEGkjieimxY8uaxKvEZBVYZ1EAT92YIpOAaVOX8q61uQOurXqJFJ2COLD3MXH0/Cnp3aSQll/l2LmfiS396JbHw6NYn7GC+2eGiMbXeQs0Wo7b17hkQeSLtsB8U+Wdx";
public static string aesKeyBase64_2 = "TL9wAPaCWj53zdbAVDdrtpAUtlKxDtySI4QtKQ5KstA=";
public static void Main()
{
byte[] key = Convert.FromBase64String(aesKeyBase64);
//IV
byte[] iv = new byte[16] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
Console.WriteLine("------------------First file-----------------\n\n");
string decrypted = AesUtils.Decrypt(Convert.FromBase64String(encryptedFileBase64), key, iv);
Console.WriteLine("------------------Proposed decryption process-----------------");
Console.WriteLine(decrypted);
Console.WriteLine("\n---------------AES CBC decryption process--------------------");
string decrypted2 = AesUtils.DecryptAesCbc(Convert.FromBase64String(encryptedFileBase64), key, iv);
Console.WriteLine(decrypted2);
Console.WriteLine("\n\n------------------Second file-----------------\n\n");
key = Convert.FromBase64String(aesKeyBase64_2);
decrypted = AesUtils.Decrypt(Convert.FromBase64String(encryptedFileBase64_2), key, iv);
Console.WriteLine("------------------Proposed decryption process-----------------");
Console.WriteLine(decrypted);
Console.WriteLine("\n---------------AES CBC decryption process--------------------");
decrypted2 = AesUtils.DecryptAesCbc(Convert.FromBase64String(encryptedFileBase64_2), key, iv);
Console.WriteLine(decrypted2);
}
}
public static class AesUtils
{
public static string Decrypt(byte[] cipherBytes, byte[] key, byte[] iv)
{
using (Aes encryptor = GetCryptoAlgorithm())
{
encryptor.Key = key;
encryptor.IV = iv;
using (MemoryStream memoryStream = new MemoryStream(cipherBytes.Length))
{
string plainText = String.Empty;
for (int i = 0; i < cipherBytes.Length; i = i + 16)
{
encryptor.IV = iv;
ICryptoTransform aesDecryptor = encryptor.CreateDecryptor();
CryptoStream cryptoStream = new CryptoStream(memoryStream, aesDecryptor, CryptoStreamMode.Write);
cryptoStream.Write(cipherBytes, i, 16);
cryptoStream.FlushFinalBlock();
}
byte[] plainBytes2 = memoryStream.ToArray();
plainText = Encoding.UTF8.GetString(plainBytes2, 0, plainBytes2.Length);
return plainText;
}
}
}
public static string DecryptAesCbc(byte[] inputArray, byte[] key, byte[] iv)
{
using (Aes aes = GetCryptoAlgorithm())
{
aes.Key = key;
aes.IV = iv;
ICryptoTransform cTransform = aes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
aes.Clear();
return Encoding.UTF8.GetString(resultArray);
}
}
private static Aes GetCryptoAlgorithm()
{
Aes algorithm = Aes.Create();
algorithm.Padding = PaddingMode.None;
algorithm.Mode = CipherMode.CBC;
algorithm.KeySize = 256;
algorithm.BlockSize = 128;
return algorithm;
}
}
加密是AES在ECB模式下使用PKCS7-padding。
如果使用此配置,它将正确解密并删除填充:
private static Aes GetCryptoAlgorithm()
{
Aes algorithm = Aes.Create();
algorithm.Padding = PaddingMode.PKCS7;
algorithm.Mode = CipherMode.ECB;
algorithm.KeySize = 256;
algorithm.BlockSize = 128;
return algorithm;
}
我在php中用AES加密法加密了文件,代码如下。 现在我正在尝试在Android中解密它,但我总是面临InvalidKey异常:密钥长度不是128/192/256位错误。这是Android代码: 有人能建议我怎么做吗?任何帮助都将不胜感激。
我想用python加密一个字符串(),并用节点解密字符串。下面是我写的。我不知道为什么它不起作用。 PyCrypto lib文档:http://pythonhosted.org//pycrypto/ 节点加密库文档:http://nodejs.org/api/crypto.html Python代码 JS代码
我正在尝试加密服务器上发送的语音文件。我使用以下过程: 将语音记录到文件>将文件转换为字节数组>用生成的密钥加密字节数组>将密钥保存到字符串>上载字节数组>从服务器加载文件>将其转换为字节数组>用生成的密钥解密<--这里,我得到一个错误
我正在尝试使用作为一个具有加密功能的文件系统。 我成功地实现了在AWS S3服务器上使用加密密钥(服务器端加密)上传文件。请找到以下工作代码: 对于加密: 代码:InvalidArgument 消息:使用AWS KMS托管密钥指定服务器端加密的请求需要AWS签名版本4。 使用KMS密钥读取对象: 这样做对吗?有什么建议吗?请帮帮忙。
我正在开发一个应用程序,其中包括播放声音文件。我的问题是声音文件是用一个命令行工具加密的,这个工具可以在Aescrypt.com上找到,只是提供文件和密码。我用Aescrypt.com上的Java代码成功解密了android应用程序中的文件,但我无论如何也不能让它在iOS上不起作用。 我已经尝试解密文件的所有字节和不包括文件头的字节。我得到一个字节的结果集,但它不会播放,估计的声音长度大约是实际长
我一直在试图找出java安全/加密库的方法,我相信我在理解发生了什么方面取得了一些进展。我想我设法让加密部分工作了。在encrypt方法中,如果我只是尝试返回,我会得到一些看起来像加密文本的不可读的杂乱无章的东西。当我试图不返回它,而是继续调用decrypt并进行明文-->encrypt-->decrypt是我所拥有的一切时,问题就来了 所以我用一些明文调用encrypt,并尝试返回明文以确保它工