Исключение, генерируемое в приложении iOS с использованием статической библиотеки cryptopp в XCode 4.6.2

Вот некоторые детали того, что у меня есть.

  • Отдельно скомпилированная сборка crypto ++ и статическая библиотека (libcryptopp.a).
  • Создан пример приложения с одним представлением, связанный с указанной библиотекой, создана новая группа, включающая заголовки crypto ++. Эти заголовки НЕ копируются в целевую папку приложения.
  • В приложении создан новый файл .mm, из которого я выполняю пример кода, который сейчас хочу отправить на консоль. Обратите внимание, что этот пример кода практически не изменился по сравнению с тем, который представлен в тестовом файле SymmetricCipher.cpp.


  • Настройки в проекте Настройки сборки:

    Настройки Apple LLVM 4.2

  • Диалект языка C — GNU99
  • Диалект C ++ — GNU ++ 11
  • Стандартная библиотека C ++ — libstdc ++


  • Внес те же изменения в существующий проект и просто вставил пример кода в существующий файл для проверки вывода. Это сработало без проблем.

  • Код в автономном приложении выдает исключение «EXC_BAD_ACCESS (код = 2, адрес = 0x20)»

      #import "TestView.h"
    //Include C++ headers
    #ifdef __cplusplus
    #include "aes.h"
    // Includes all required Crypto++
    // Block Cipher Headers
    #include "SymmetricCipher.h"
    #include <iostream>
    #include <iomanip>
    
    // Crypto++ Includes
    #include "modes.h" // xxx_Mode< >
    #include "filters.h" // StringSource and
    // StreamTransformation
    
    #include "sha.h"#include "base64.h"
    #endif@implementation TestView
    
    - (id)initWithFrame:(CGRect)frame
    {
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code
    }
    return self;
    }
    
    - (void)testBlock
    {
    
    //Test code
    byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ];
    
    ::memset( key, 0x01, CryptoPP::AES::DEFAULT_KEYLENGTH );
    ::memset( iv, 0x01, CryptoPP::AES::BLOCKSIZE );
    
    // Message M
    std::string PlainText = "Yoda said,Do or Do Not. There is no try.";
    
    // Cipher Text Sink
    std::string CipherText;
    
    // Encryptor
    CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption
    Encryptor( key, sizeof(key), iv );
    
    // Encryption
    CryptoPP::StringSource( PlainText, true,
    new CryptoPP::StreamTransformationFilter( Encryptor, new             CryptoPP::StringSink(CipherText )) // StreamTransformationFilter
    ); // StringSource
    
    // example of hashing followed by base64 encoding, using filters
    std::string digest;
    
    CryptoPP::SHA256 hash;  // don't use MD5 anymore. It is considered insecure
    
    CryptoPP::StringSource foo(PlainText, true,
    new CryptoPP::HashFilter(hash, new CryptoPP::Base64Encoder (new CryptoPP::StringSink(digest))));
    
    NSLog(@"SHA256 Hash %s", digest.c_str());
    
    }
    
    @end
    

0

Решение

Код Crypto ++ хорош. Ваша проблема лежит в другом месте.

Вместо того, чтобы пытаться скомпилировать Crypto ++, возможно, вам стоит попробовать cryptopp-5.6.2-ios на GitHub. Есть встроенная библиотека для 6.1 SDK (armv7, armv7s, i386); и готовая библиотека для 7.0 SDK (armv7, armv7s, arm64, i386).

Тестовый код Crypto ++ / iOS

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector