Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用普通加密和加密+加密时的不同结果+;有AES_C++_Objective C_Encryption_Crypto++_Commoncrypto - Fatal编程技术网

C++ 使用普通加密和加密+加密时的不同结果+;有AES

C++ 使用普通加密和加密+加密时的不同结果+;有AES,c++,objective-c,encryption,crypto++,commoncrypto,C++,Objective C,Encryption,Crypto++,Commoncrypto,当我用苹果公司的通用加密和Crypto++用相同的密钥加密同一个文件(二进制数据)时,会得到不同的结果。我使用的算法是AES 以下是使用通用密码的目标C中的代码: void FileUtil::writeToFileEncrypt(string fileName, const void *data, int size, string key, int *sizeOut) { int numBytesEncrypted = 0; char keyPtr[kCCKeySizeAES2

当我用苹果公司的通用加密和Crypto++用相同的密钥加密同一个文件(二进制数据)时,会得到不同的结果。我使用的算法是AES

以下是使用通用密码的目标C中的代码:

void FileUtil::writeToFileEncrypt(string fileName, const void *data, int size, string key, int *sizeOut)
{
    int numBytesEncrypted = 0;
    char keyPtr[kCCKeySizeAES256+1];

    if (key.length() > 32)
    {
        key = key.substr(0, 32);
    }

    memcpy(keyPtr, key.c_str(), sizeof(keyPtr));

    if (key.length() < 32)
    {
        for (int i = key.length(); i < 32; i++)
        {
            keyPtr[i] = '0';
        }
    }

    size_t bufferSize = size + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES256,
                                      NULL /* initialization vector (optional) */,
                                      data, size, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {
        cout << "encrypt success" << endl;
    }

    ofstream myfile;
    myfile.open (fileName.c_str(), ios::out | ios::binary);
    myfile.write((const char *)buffer, numBytesEncrypted);
    myfile.close();

    free(buffer);

    *sizeOut = numBytesEncrypted;
}
void FileUtil::writeToFileEncrypt(字符串文件名、常量void*数据、整数大小、字符串密钥、整数*大小输出)
{
int numBytesEncrypted=0;
char-keyPtr[kCCKeySizeAES256+1];
如果(key.length()>32)
{
key=key.substr(0,32);
}
memcpy(keyPtr,key.c_str(),sizeof(keyPtr));
if(key.length()<32)
{
for(int i=key.length();i<32;i++)
{
keyPtr[i]=“0”;
}
}
size\u t bufferSize=size+kccblocksizeaaes128;
void*buffer=malloc(bufferSize);
大小\u t numBytesEncrypted=0;
CCCryptorStatus cryptStatus=CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,
keyPtr,kCCKeySizeAES256,
NULL/*初始化向量(可选)*/,,
数据、大小、/*输入*/
缓冲区,缓冲区大小,/*输出*/
&(未加密);
if(cryptStatus==kCCSuccess){
库特
>P>“Objul-C”版本不是Objto-C编写的,它是C++语言。实际加密使用的是代码> CCCrypt < /C> >,它是“C”。

>P>“Objul-C”版本没有提供<代码> IV/COD>,因此默认为全零。C++版本提供ASCII“0”字符的<代码> IV>代码,这与所有零数据不相同。这可能是错误。

  • 在加密调用之前和之后,为每个加密调用提供输入和输出十六进制数据转储,包括密钥、iv、数据输入和数据输出

  • 这是错误的:

    memcpy(keyPtr, key.c_str(), sizeof(keyPtr));
    
    keyPtr[32] = '\0';
    
    它试图复制33个字节。我认为您需要以下内容:

    size_t ksize = std::min(sizeof(keyPtr), key.size());
    assert(ksize == 16 || ksize == 24 || ksize == 32);
    
    ----- 一般来说,设计是错误的:

    memcpy(keyPtr, key.c_str(), sizeof(keyPtr));
    
    keyPtr[32] = '\0';
    
    密钥是二进制的,而不是ASCII字符串。如果您使用的是密码,那么它仍然是错误的,因为您应该使用KDF将密码消化为合适的密钥

    ----- 普通加密代码缺少IV,可能不会使用与Crypto++示例相同的填充

    ----- AES的使用似乎是错误的。您的密码似乎是在ECB模式下操作的,因此,如果数据小于块大小,它只能提供机密性。它可能会被重新排序和操纵,因此不能提供真实性保证。您应该使用类似或模式


    因为普通加密是蹩脚的(它不提供经过身份验证的加密模式),而Crypto++提供了您所需要的一切(并且它几乎在任何地方运行)你应该使用密码+ +和一个经过认证的加密模式。< /P>如果你在C++中工作,为什么要使用<代码> MalOC ?你应该使用<代码>新的<代码>,或者使用<代码> AutoPtR 或者一个标准的容器,比如<代码>矢量<代码>或<代码>数组<代码>。你是对的,我不应该使用Maloc。我来自C背景,是新的C++。普通密码默认为CBC,为了使用ECB必须明确地设置它不是。注意,虽然一个糟糕的编码选择“0”不是0,不是“0”。然而不幸的是,普通密码不支持EAX、GCM或CCM模式,除非这些模式是必需的,所以常用的密码是最好的。Luption由苹果公司提供,可以正常工作,在iOS社区中很容易理解,并且不需要编译Crypto++。@Zaph-感谢通用的加密更正。Crypto++只允许一组源代码,所以我不确定用苹果的库重新实现是否有好处,因为它只在一个平台上运行。一个实现似乎比一个更好4个实现(Crypto++、iOS、Android、Windows)。此外,我们知道苹果的实现存在未修复的错误。这会导致OpenSSL和ECDHE/ECDSA出现很多问题。请指向“苹果的实现存在未修复的错误”的信息,我很想看到它们。另外,如果Crypto++有一个适用于php的版本,这将是一个巨大的优势,因为php填充不是PKCS#7和PITA。@Zaph-例如,请参见OpenSSL wiki。别忘了他们的。我甚至有公开的错误报告,说明他们的安全设备存在缺陷。他们还没有公开。Goto Fail不是普通密码,SSL_OP_SAFARI_ECDHE_ECDSA_BUG也不是。查看Crypto++wiki,似乎需要GCC,它不再随Xcode一起提供。iv是主要问题。感谢回复。