0

我正在开发一个可以播放声音文件的应用程序。我的问题是声音文件是使用命令行工具加密的,该工具可以在aescrypt.com上找到,只需提供文件和密码。我已经使用 aescrypt.com 上的 java 代码成功解密了 android 应用程序中的文件,但我一辈子都不能让它在 iOS 中工作。

我试图解密文件的所有字节以及不包括文件头的字节。我得到了一组字节的结果,但它不会播放,并且声音的估计长度约为实际长度的四分之一。

NSRange range = NSMakeRange(0, self.length);
unsigned char* encrypteddata = malloc(range.length);
[self getBytes:encrypteddata range:range];
size_t outSize;
unsigned char* result = malloc(range.length + 16);
CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 0x00, decryptkey, sizeof(decryptkey), nil, encrypteddata, self.length, result, self.length + 16, &outSize);
NSData *returnData = nil;
if (status == kCCSuccess) {
    returnData = [NSData dataWithBytesNoCopy:result length:outSize];
}

解密密钥只是用于加密文件的密码中的字节。

我已经研究解决方案至少一周了,但没有取得任何进展。有很多事情可以做错,有很多可能(和不可能)的组合。

更新: 我需要的是一个足够简单的工具,我们的客户可以使用它来加密他们端的声音文件,并且对于 Android 和 iOS 上的应用程序在另一端解密也很简单。它不需要非常安全,它只需要防止Android上的普通用户打开并播放光盘中的文件。如果 aescrypt.com 工具不适合此,我很高兴欢迎其他建议。

4

2 回答 2

1

你为什么坚持使用 AESCrypt 应用程序?他们将自定义标头写入加密文件。他们分发源代码,这将为您提供有关如何解密的足够信息(并且,您可能可以重用他们的源代码)。在 AES 加密源代码中检查他们的 AESCryptWorkerThreads.cpp。

于 2013-01-21T17:16:40.523 回答
0

AESCrypt 格式带有重要的配置信息。大多数格式在他们的网站(aes_file_format.html)上有详细说明。不幸的是,此页面没有解释他们的自定义 KDF。您必须在以下位置使用或对其encrypt_stream功能进行逆向工程aescrypt.c

// Hash the IV and password 8192 times
memset(digest, 0, 32);
memcpy(digest, IV, 16);
for(i=0; i<8192; i++)
{
    sha256_starts(  &sha_ctx);
    sha256_update(  &sha_ctx, digest, 32);
    sha256_update(  &sha_ctx,
                    (unsigned char*)passwd,
                    (unsigned long)passlen);
    sha256_finish(  &sha_ctx,
                    digest);
}

他们不使用 CommonCryptor,所以如果你想要硬件优化的代码,你必须自己在 CommonCryptor 中重新实现这种格式。

请注意,您的解密代码没有 IV、KDF 和 HMAC,因此任何以这种方式实际加密的东西都是非常不安全的。AESCrypt 确实提供了适当的 IV 和 HMAC,它的 KDF 可能是安全的,虽然不是标准的,所以它是一个合理的选择。

于 2013-01-21T19:43:06.937 回答