1回のエンコード問題のデバッグ履歴

3399 ワード

背景紹介

  • ファイル内容をAES 128で暗号化する
  • ファイルをバックグラウンドに置き、ファイル内容のmd 5値
  • を事前に算出する.
  • クライアントはダウンロードして、先にmd 5を計算して、ファイルが
  • 修正されていないことを保証します
  • AES 128は、オリジナルコンテンツを復号化し、
  • を用いる.

    イニシアチブ


    暗号化端子

  • ファイルを読み出し、NSData形式に変換し、UTF 8符号化
  • .
  • NSData用AES 128暗号化
  • md 5値を計算し、ファイル
  • を保存する.

    復号端子

  • ファイルを読み出し、NSData形式に変換し、UTF 8符号化
  • .
  • これは暗号文で、md 5値を計算し、ファイルが改ざんされているかどうかを確認します.
  • AES 128は、元のコンテンツを復号し、NSStringに変換する
  • を用いる.

    に質問

  • NSDataを直接ファイルに保存し、バイナリを文字として処理したことを隠します.その結果、復号されたファイルは大きくなり、md 5も内容も間違っていることがわかります.
  • NSDataは、ファイル操作に関連して文字列が必要であるデータストリームとして理解され、base 64は、ストリームと文字列を変換する方法がある.

  • ソリューション


    ファイルを保存する前に、NSDataをbase 64文字列に変換して保存すると、このような問題は発生しません.もちろん、復号プロセスにはbase 64復号が追加されます.

    サンプルコード

    - (void)encodeProcess {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"patch-raw" ofType:@"js"];
        NSLog(@"path: %@", path);
        NSString *rawString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"rawString: %@", rawString);
        NSData *rawData = [rawString dataUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"rawData: %@", rawData);
        NSData *encryptData = [rawData AES128EncryptWithKey:encodeKey gIv:ivKey];
        NSLog(@"encryptData: %@", encryptData);
        NSString* base64String = [encryptData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
        NSLog(@"base64String: %@", base64String);
        NSString *md5 = [base64String MD5String];
        NSLog(@"md5: %@", md5);
    }
    
    - (void)decodeProcess {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"patch" ofType:@"js"];
        NSLog(@"path: %@", path);
        NSString *base64String = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"base64String: %@", base64String);
        NSString *md5 = [base64String MD5String];
        NSLog(@"md5: %@", md5);
        NSData *encryptData = [[NSData alloc] initWithBase64EncodedString:base64String options:NSDataBase64DecodingIgnoreUnknownCharacters];
        NSLog(@"encryptData: %@", encryptData);
        NSData *decodeData = [encryptData AES128DecryptWithKey:encodeKey gIv:ivKey];
        NSLog(@"decodeData: %@", decodeData);
        NSString *rawString = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding];
        NSLog(@"rawString: %@", rawString);
    }
    

    patch-raw.js

    defineClass('PolicyCell',{loadData_policeType:function(data,type){self.ORIGloadData_policeType(data,type);self.lbGroup().removeFromSuperview();}}, {})
    

    patch.js

    823SE2VxM7H65r9synXs+IWwZA5CY8oFoG3YM5OPn6D+vr5ZWOvUTb7Rb63/HyHs
    lNh1Ugd+ZK3kQTIrvDZfyHH+ht+CGcQYWCxYmlcp5M9slsvGEC+haiL4ttpjT/cd
    Kx+eh2EUi9MgaBZsz7yC0yQhGXb6M7FFTA4lzba7uPi1M5qTXpLMYsLGqkxFN5EW
    kUV7N4F9qQcXqSSyhloS8A==
    

    md5


    base 64文字をファイルにコピーするときにスペースなどの非表示文字を付ける可能性があるため、前後の2つのmd 5は一致しません.しかし、実際の機能には影響しません.

    data形式のbase 64

  • ファイルを保存する場合は、上のbase 64文字列を使用したほうが
  • です.
  • data形式のbase 64はここではあまり使いにくいので、
  • はお勧めしません.

    AES128

  • keyとか違いますが、復号化された文字列が違うので、合わせればいいです.
  • ネットワーク伝送に関与しなければmd 5、AES 128等は不要であり、デバッグが面倒である
  • .