2017-04-12 1 views
0

C#으로 작성된 서버 응용 프로그램에서 AES를 사용하여 일부 데이터를 암호화합니다.C# 및 CryptoJS를 사용한 다른 암호화 결과

async Task<byte[]> Encrypt(string privateKey, string pin, byte[] data) 
{ 
    using (var sha = SHA256.Create()) 
    { 
     byte[] keyHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{privateKey}")); 
     byte[] pinHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{pin}")); 
     using (Aes aes = Aes.Create()) 
     { 
      byte[] key = keyHash.Slice(0, aes.Key.Length); 
      byte[] iv = pinHash.Slice(0, aes.IV.Length); 
      using (ICryptoTransform transform = aes.CreateEncryptor(key, iv)) 
      using (var stream = new MemoryStream()) 
      using (var cryptStream = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
      { 
       await cryptStream.WriteAsync(data, 0, data.Length); 
       await cryptStream.FlushAsync(); 

       return stream.ToArray(); 
      } 
     } 
    } 
} 

암호화 결과 : I는 I 데이터를 암호화하는 데 사용이 내 C# 코드이다

Key: 81fe1681..6a451c1c 
IV: e83c..ae76 

예를 들면 소정의 버튼 (32 바이트) 및 IV (16 바이트), ... 사용 데이터는 다음과 같습니다 ...

534c..28f5 

이제 CryptoJS를 사용하여 클라이언트 응용 프로그램에서 데이터의 암호를 해독합니다. 나는 똑같은 키와 IV 정보를 사용하지만 암호 해독은 실패한 것처럼 보입니다 ... 적어도 해독 된 결과는 항상 비어 있습니다.

그래서 클라이언트의 데이터를 암호화했습니다 (물론 동일한 키와 IV). 결과적으로 암호화 된 텍스트가 다릅니다. 더 정확하게는 ... 동일하지만 마지막에 더 많은 데이터를 가지고

534c..28f5bbd5..ac0e 

내가 서버에서 데이터를 암호화 할 경우 얻을하지는 끝에이 추가 데이터는 무엇입니까?

클라이언트에서 암호화 된 암호화 된 텍스트의 암호를 해독하면 암호 해독이 작동합니다. 간단히 말해 모드와 패딩은 서버와 클라이언트 모두에서 기본값 인 CBCPkcs7입니다. keysize는 256이어야합니다. 이것은 서버가 암호화 한 데이터의 암호를 해독하는 데 사용하는 코드입니다.

let keyHash: WordArray = CryptoJS.SHA256(CryptoJS.enc.Utf8.parse(privateKey)); 
let key: WordArray = CryptoJS.lib.WordArray.create(keyHash.words.slice(0, 8), 32); 

let pinHash: WordArray = CryptoJS.SHA256(CryptoJS.enc.Utf8.parse(pin)); 
let iv: WordArray = CryptoJS.lib.WordArray.create(pinHash.words.slice(0, 4), 16); 

let cfg: CryptoJS.lib.IBlockCipherCfg = { iv: iv }; 
let paramsData: CryptoJS.lib.CipherParamsData = { 
    ciphertext: cipherBuffer 
}; 

let decrypted: WordArray = CryptoJS.AES.decrypt(paramsData, key, cfg); 

답변

1

쓰기의 경우 블록 플러시에 문제가있었습니다. FlushFinalBlock()Flush() (또는 FlushAsync())과 구별됩니다. 둘 다해야하거나 단순히 CryptoStream을 처분해야합니다. 이것은 코드가 마지막 데이터 블록을 작성하지 않았다는 사실을 해결할 것입니다.

async static Task<byte[]> Encrypt(string privateKey, string pin, byte[] data) 
{ 
    using (var sha = SHA256.Create()) 
    { 
     byte[] keyHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{privateKey}")); 
     byte[] pinHash = sha.ComputeHash(Encoding.UTF8.GetBytes($"{pin}")); 
     using (Aes aes = Aes.Create()) 
     { 
      byte[] key = keyHash.Slice(0, aes.Key.Length); 
      byte[] iv = pinHash.Slice(0, aes.IV.Length); 

      Trace.WriteLine($"Key length: { key.Length }, iv length: { iv.Length }, block mode: { aes.Mode }, padding: { aes.Padding }"); 

      using (var stream = new MemoryStream()) 
      using (ICryptoTransform transform = aes.CreateEncryptor(key, iv)) 
      { 
       using (var cryptStream = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
       { 
        await cryptStream.WriteAsync(data, 0, data.Length); 
       } 

       return stream.ToArray(); 
      } 
     } 
    } 
} 

타이프 스크립트 코드는 암호를 해독 할 수있는 것 같습니다.

작동 방식 : https://jsfiddle.net/uj58twrr/3/

+0

감사합니다. 문제가 해결되었습니다. – Matze

관련 문제