2017-02-02 8 views
-1

私はAES Decryptionをc#で暗号化しており、復号化後に最後の数文字にいくつかのガベージデータが表示されます。私はあなたがデバッグに結果に見るならば、それはショーはいくつかの文字が続く復号Androidで動作しているiOSでAES復号化機能が使用されていないFBEncryptiorライブラリ

+ (NSData*)decryptData:(NSData*)data key:(NSData*)key iv:(NSData*)iv; 
{ 
    NSData* result = nil; 

// setup key 
unsigned char cKey[FBENCRYPT_KEY_SIZE]; 
bzero(cKey, sizeof(cKey)); 
[key getBytes:cKey length:FBENCRYPT_KEY_SIZE]; 

// setup iv 
char cIv[FBENCRYPT_BLOCK_SIZE]; 
bzero(cIv, FBENCRYPT_BLOCK_SIZE); 
NSLog(@"CIV2 : %s",cIv); 

if (iv) { 
    [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE]; 
} 

// setup output buffer 
size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE; 
void *buffer = malloc(bufferSize); 

// do decrypt 
size_t decryptedSize = 0; 
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 
             FBENCRYPT_ALGORITHM, //kCCAlgorithmAES128 
             kCCOptionPKCS7Padding, 
             cKey,     //16 
             FBENCRYPT_KEY_SIZE, //16 
             cKey, 
             [data bytes], 
             [data length], 
             buffer, 
             bufferSize, 
             &decryptedSize); 

if (cryptStatus == kCCSuccess) { 

    result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize]; 
} else { 
    free(buffer); 
    NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus); 
} 

return result; 

}

ためのコードの下に使用しています

はゴミを食べましたが、完全なデータを復号化します。

NSData* data = [self decryptData:encryptedData 
          key:[keyString dataUsingEncoding:NSUTF8StringEncoding] 
           iv:nil]; 

if (data) { 
    return [[NSString alloc] initWithData:data 
            encoding:NSUTF8StringEncoding]; 

}

データは、ゼロの値を返しています。

C#コードは以下のとおりです。

public RijndaelManaged GetRijndaelManaged(String secretKey) 
{ 
    var keyBytes = new byte[16]; 
    var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey); 
    Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length)); 
    return new RijndaelManaged 
    { 
     Mode = CipherMode.CBC, 
     Padding = PaddingMode.PKCS7, 
     KeySize = 128, 
     BlockSize = 128, 
     Key = keyBytes, 
     IV = keyBytes 
    }; 
} 

public byte[] Encrypt(byte[] plainBytes, RijndaelManaged rijndaelManaged) 
{ 
    return rijndaelManaged.CreateEncryptor() 
     .TransformFinalBlock(plainBytes, 0, plainBytes.Length); 
} 

public byte[] Decrypt(byte[] encryptedData, RijndaelManaged rijndaelManaged) 
{ 
    return rijndaelManaged.CreateDecryptor() 
     .TransformFinalBlock(encryptedData, 0, encryptedData.Length); 
} 

/// <summary> 
/// Encrypts plaintext using AES 128bit key and a Chain Block Cipher and returns a base64 encoded string 
/// </summary> 
/// <param name="plainText">Plain text to encrypt</param> 
/// <param name="key">Secret key</param> 
/// <returns>Base64 encoded string</returns> 
public String Encrypt(String plainText, String key) 
{ 
    var plainBytes = Encoding.UTF8.GetBytes(plainText); 
    return Convert.ToBase64String(Encrypt(plainBytes, GetRijndaelManaged(key))); 
} 

/// <summary> 
/// Decrypts a base64 encoded string using the given key (AES 128bit key and a Chain Block Cipher) 
/// </summary> 
/// <param name="encryptedText">Base64 Encoded String</param> 
/// <param name="key">Secret Key</param> 
/// <returns>Decrypted String</returns> 
public String Decrypt(String encryptedText, String key) 
{ 
    var encryptedBytes = Convert.FromBase64String(encryptedText); 
    return Encoding.UTF8.GetString(Decrypt(encryptedBytes, GetRijndaelManaged(key))); 
} 
のC#から

受信データ: 0Nwr30kSkJxGCYiFg8TUrfW51587SUkS8lQ7Uno7gglxjVGW5gR4MA + isTknjXzKのiOSから

Key uses for encryption : e64f9fa01f0418 

復号化されたデータ:{ "Successeed":! 「abcdefghijklmnopqrstuvwx ... ``〜

予想される復号化データ:{"成功" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"}

+1

これは恐ろしく安全ではありません。キーは秘密ではありません。キーをIVとしても使用するので、実際のセキュリティはありません。 –

+0

ああ、ありがとうございました。 – SM18

+0

ランダムなIVを作成し、復号化に使用するために暗号化されたデータの接頭辞を付けるだけで、秘密を必要としません。 – zaph

答えて

1

ヘクス227dを含んでいた暗号化データ。

データの16進表現:
7b22537563636565646564223a226162636465666768696a6b6c6d6e6f707172737475767778797a 227d

文字列表現:
{"Succeeded":"abcdefghijklmnopqrstuvwxyz"}


それはAES 16、24又は32バイトのために、完全長のキーを使用するのが最適であり、あなたの鍵は14バイトで、いくつかの未定義のメソッドがそれを拡張するために使われます。さらに、IVはAESの場合は16バイトのロック・サイズでなければなりません。パディングが実装間で同じ(0x00)と思われるのは運が良かっただけで、運が頼らないのです。

テストコード:

// Explicit null pad the key and IV to correct lengths 
NSData *ivData = [@"e64f9fa01f0418\x00\x00" dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *keyData = [@"e64f9fa01f0418\x00\x00" dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *base64EncryptedString = @"0Nwr30kSkJxGCYiFg8TUrfW51587SUkS8lQ7Uno7gglxjVGW5gR4MA+isTknjXzK"; 
NSData *encryptedData = [[NSData alloc] initWithBase64EncodedString:base64EncryptedString options:0]; 

NSMutableData *plainData = [NSMutableData dataWithLength: encryptedData.length]; 
size_t movedBytes = 0; 

CCCryptorStatus ccStatus; 
ccStatus = CCCrypt(kCCDecrypt, 
        kCCAlgorithmAES128, 
        kCCOptionPKCS7Padding, 
        keyData.bytes, kCCKeySizeAES128, 
        ivData.bytes, 
        encryptedData.bytes, encryptedData.length, 
        plainData.mutableBytes, plainData.length, 
        &movedBytes); 

plainData.length = movedBytes; 
NSLog(@"Data: %@",plainData); 
NSString *decryptedString = [[NSString alloc] initWithData:plainData encoding:NSUTF8StringEncoding]; 
NSLog(@"String: %@",decryptedString); 
+0

今、暗号化されたデータの先頭にコードを使用して、〜￉yÊwÒ... e、この文字列を取得します。 – SM18

+0

開始点のコードをコピーして貼り付けます。 「復号化されたデータの取得開始時」とはどういう意味ですか? – zaph

+0

おかげさまで、ありがとうございました。 – SM18

関連する問題