iOSのAES暗号化

せっかちな子供用の靴は、直接ここを見てデモを
実行した後、オンラインで暗号化されて行くことができ、サイトの検証を

また、ラインダール暗号化方式として知られているAES(のAdvanced Encryption Standard)のAdvanced Encryption Standardは、米国連邦政府によって採用されたブロック暗号化規格です。この規格は、元のDESを置き換えるために使用されます

ファイブAES暗号化モード

5つのAES暗号化モード(CBC、ECB、CTR、OCF 3、CFB)があります
。1.電子コードブックモード(電子コードブックブック(ECB)
2.暗号ブロック連鎖モード(暗号ブロック連鎖(CBC))
3.電卓モード(カウンタ(CTR))
4.暗号フィードバックモード(暗号フィードバック(CFB))
出力フィードバックモード(出力フィードバック(OFB))5。

IOSは、一般に、ECBとCBC二種類で使用されています。

このパターンコードECB-

ECBは、それぞれが個別に暗号化された同じキーを使用した後、ブロックに分割(AES 128ビットの暗号化ブロックが固定されている)は、暗号化前の最も単純なブロック暗号の暗号化モード、暗号ブロックサイズであるので、これに応じて生成された同一の暗号化された平文ブロック暗号文。

暗号ブロック連鎖モードCBC-

各暗号文ブロックのためのCBCモードでは、最初の暗号文のパスワード前のブロックとは、暗号化XOR暗号化を使用する暗号化の前に暗号化されます。最初の平文ブロックとの排他的論理和と呼ばれる初期化ベクトルデータブロック。

OK、最も単純な理論的な理解は、私たちは、最も重要なのiOS乾燥品を見ていきます:暗号化と復号化機能をCCCrypt

CCCrypt - 暗号化と復号化機能

CCCryptorStatus CCCrypt(
    CCOperation op,         /* kCCEncrypt, etc. */
    CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */ CCOptions options, /* kCCOptionPKCS7Padding, etc. */ const void *key, size_t keyLength, const void *iv, /* optional initialization vector */ const void *dataIn, /* optional per op and alg */ size_t dataInLength, void *dataOut, /* data RETURNED here */ size_t dataOutAvailable, size_t *dataOutMoved) 

重要なパラメータ:

  1. CCOperationオペアンプ:暗号化kCCEncrypt、復号化kCCDecrypt
  2. CCAlgorithm ALG:同じkCCAlgorithmAES128とkCCAlgorithmAESは、AES 128ビットの暗号化ブロックが固定されている暗号化は、異なる(もちろん、ラウンドの暗号化処理の数は、多くの場合、異なる長AES128,192,256は、暗号化キーの暗号化のみ、ここで前記しました説明されていません)
  3. オプションのCCOptions:
    kCCOptionPKCS7Padding:塗りつぶしモード
    kCCOptionECBMode:ECBモード
  4. size_tのKEYLENGTH:それは128または256であるかどうか、次のパラメータは、ブログの多くを見ている、彼らはここにkCCBlockSizeAES128に書かれている、これは権利ではありませんが、この暗号化128暗号化のうち、まだです
enum {
    kCCKeySizeAES128          = 16,
    kCCKeySizeAES192          = 24,
    kCCKeySizeAES256          = 32,
    kCCKeySizeDES             = 8, kCCKeySize3DES = 24, kCCKeySizeMinCAST = 5, kCCKeySizeMaxCAST = 16, kCCKeySizeMinRC4 = 1, kCCKeySizeMaxRC4 = 512, kCCKeySizeMinRC2 = 1, kCCKeySizeMaxRC2 = 128, kCCKeySizeMinBlowfish = 8, kCCKeySizeMaxBlowfish = 56, }; 
  1. IV:オフセットベクトルは、CBCモードが必要で、ECBは必要がなく、16ビットのデフォルト値0を渡しません。
CCCryptキーとKEYLENGTH

128ビットのAESブロックサイズは、長さが16文字IVを(IVせずECBモード)、指定されたキー文字に従ってキーは、キーの長さにわたって、それぞれ16,24,32ビットとIVが取られる必要があります作る「\ 0」を埋めるの端よりも少ないです

今考えキーとKEYLENGTHの関係は、それを考え出した、私たちは、キーは、キーが32を通過している場合には、実際の差aes128,192,256で、KEYLENGTHは、キーの長さを決定することで、鍵となる合格ビット256は、必要なビット数であるが、KEYLENGTHはkCCKeySizeAES128を選択し、その後、実際のキーは、キーパス16と、実際に16の前に傍受が、KEYLENGTHはkCCKeySizeAES256を選択し、そのキービットであることは十分ではない、意志オートコンプリート32
= 16,192keysize = 24,256keysize = 32の128キーサイズ、キーの長さは、自動的に充填または傍受、十分ではないが、感情は、正しいキーが良好で渡されているが

まあ、直接コードに
デモ
を導入する必要があります#import <CommonCrypto/CommonCrypto.h>

AES256 ECBモードの暗号化

+(NSData *)dataByAes256ECB:(NSData *)data key:(NSString *)key mode:(CCOperation)operation {
    char keyPtr[kCCKeySizeAES256 + 1];//选择aes256加密,所以key长度应该是kCCKeySizeAES256,32位 bzero(keyPtr, sizeof(keyPtr));//清零 [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];//秘钥key转成cString NSUInteger dataLength = data.length; size_t bufferSize = dataLength + kCCBlockSizeAES128; void * buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode,//ECB模式 keyPtr, kCCKeySizeAES256, NULL,//选择ECB模式,不需要向量 data.bytes, dataLength, buffer, bufferSize, &numBytesDecrypted); if (cryptStatus == kCCSuccess) { NSData * result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; return result; } free(buffer); return nil; } 

AES128 CBCモードの暗号化

+(NSData *)dataByAes128CBC:(NSData *)data key:(NSString *)key mode:(CCOperation)operation iv:(NSString *)iv {
    char keyPtr[kCCKeySizeAES128 + 1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = data.length; size_t bufferSize = dataLength + kCCBlockSizeAES128; void * buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; NSString * initIv = iv; char ivPtr[kCCBlockSizeAES128+1]; memset(ivPtr, 0, sizeof(ivPtr)); [initIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; CCCryptorStatus cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES128, ivPtr, data.bytes, dataLength, buffer, bufferSize, &numBytesDecrypted); if (cryptStatus == kCCSuccess) { NSData * result = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; return result; } free(buffer); return nil; } 

オンライン検証

おすすめ

転載: www.cnblogs.com/Free-Thinker/p/11425717.html