使用XCode 4.6.2上的cryptopp静态库在iOS应用程序中抛出异常

时间:2013-04-23 01:24:28

标签: c++ ios objective-c xcode crypto++

以下是我所拥有的一些细节。

  • 单独编译的crypto ++ build并拥有一个静态库(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
    

1 个答案:

答案 0 :(得分:1)

Crypto ++代码很好。你的问题出在其他地方。

您可以尝试cryptopp-5.6.2-ios on GitHub,而不是尝试交叉编译Crypto ++。它有一个预先构建的6.1 SDK胖库(armv7armv7si386);和7.0 SDK的预构建胖库(armv7armv7sarm64i386)。

Crypto++/iOS test code