Ric*_*ira 15 c encryption macos openssl aes
我正在研究C中的一个跨平台(Windows和Mac OS X)代码,它需要使用带有CBC的AES-256和128位的块大小来加密/解密blob.在各种库和API中,我选择了OpenSSL.
然后,这段代码将使用多部分形式的PUT将blob上传到服务器,然后服务器使用.NET的加密框架(Aes,CryptoStream等)中的相同设置对其进行解密.
我面临的问题是,在Windows上进行本地加密时服务器解密工作正常,但在Mac OS X上进行加密时服务器解密失败 - 服务器抛出"填充无效且无法删除异常".
我从很多方面看了这个:
作为参考框架,我将发布C客户端的加密代码和服务器的C#代码进行解密.服务器端的一些小细节将被省略(它们不会干扰加密代码).
客户:
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void
__setup_aes(EVP_CIPHER_CTX *ctx, const char *key, qvr_bool encrypt)
{
static const char *iv = ""; /* for security reasons, the actual IV is omitted... */
if (encrypt)
EVP_EncryptInit(ctx, EVP_aes_256_cbc(), key, iv);
else
EVP_DecryptInit(ctx, EVP_aes_256_cbc(), key, iv);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void
__encrypt(void *buf,
size_t buflen,
const char *key,
unsigned char **outbuf,
size_t *outlen)
{
EVP_CIPHER_CTX ctx;
int blocklen = 0;
int finallen = 0;
int remainder = 0;
__setup_aes(&ctx, key, QVR_TRUE);
EVP_CIPHER *c = ctx.cipher;
blocklen = EVP_CIPHER_CTX_block_size(&ctx);
//*outbuf = (unsigned char *) malloc((buflen + blocklen - 1) / blocklen * blocklen);
remainder = buflen % blocklen;
*outlen = remainder == 0 ? buflen : buflen + blocklen - remainder;
*outbuf = (unsigned char *) calloc(*outlen, sizeof(unsigned char));
EVP_EncryptUpdate(&ctx, *outbuf, outlen, buf, buflen);
EVP_EncryptFinal_ex(&ctx, *outbuf + *outlen, &finallen);
EVP_CIPHER_CTX_cleanup(&ctx);
//*outlen += finallen;
}
Run Code Online (Sandbox Code Playgroud)
服务器:
static Byte[] Decrypt(byte[] input, byte[] key, byte[] iv)
{
try
{
// Check arguments.
if (input == null || input.Length <= 0)
throw new ArgumentNullException("input");
if (key == null || key.Length <= 0)
throw new ArgumentNullException("key");
if (iv == null || iv.Length <= 0)
throw new ArgumentNullException("iv");
byte[] unprotected;
using (var encryptor = Aes.Create())
{
encryptor.Key = key;
encryptor.IV = iv;
using (var msInput = new MemoryStream(input))
{
msInput.Position = 0;
using (
var cs = new CryptoStream(msInput, encryptor.CreateDecryptor(),
CryptoStreamMode.Read))
using (var data = new BinaryReader(cs))
using (var outStream = new MemoryStream())
{
byte[] buf = new byte[2048];
int bytes = 0;
while ((bytes = data.Read(buf, 0, buf.Length)) != 0)
outStream.Write(buf, 0, bytes);
return outStream.ToArray();
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么会发生这种情况?作为参考,这是来自Microsoft的参考源.sln的.NET方法(我认为)进行解密:https://gist.github.com/Metaluim/fcf9a4f1012fdeb2a44f#file-rijndaelmanagedtransform-cs
小智 0
OpenSSL 版本 0.9.8* 和 1.0.1* 之间的 AES 填充方案已更改(至少在 0.9.8r 和 1.0.1j 之间)。如果您的两个模块使用这些不同版本的 OpenSSL,那么这可能是您出现问题的原因。要验证这一点,请首先检查 OpenSSL 版本。如果您遇到所描述的情况,您可以考虑将填充方案对齐为相同。
归档时间: |
|
查看次数: |
899 次 |
最近记录: |