私は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"}
これは恐ろしく安全ではありません。キーは秘密ではありません。キーをIVとしても使用するので、実際のセキュリティはありません。 –
ああ、ありがとうございました。 – SM18
ランダムなIVを作成し、復号化に使用するために暗号化されたデータの接頭辞を付けるだけで、秘密を必要としません。 – zaph