이 온라인 도구에서 사용하는 AES 암호화를 복제하는 방법

광대

http://aes.online-domain-tools.com/

CBC를 사용하여 C #으로이 암호화를 복제하려고하지만 시도해도 동일한 결과를 얻지 못합니다.

지금까지 내 코드 :

    private byte[] hex2bytes(string s)
    {
        return Enumerable.Range(0, s.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(s.Substring(x, 2), 16))
                         .ToArray();        
    }

private AesCryptoServiceProvider GetProvider(byte[] key)
{
    AesCryptoServiceProvider result = new AesCryptoServiceProvider();
    result.BlockSize = 128;
    result.KeySize = 128;
    result.Mode = CipherMode.CBC;
    result.Padding = PaddingMode.PKCS7;

    result.GenerateIV();
    //result.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    result.IV = hex2bytes("ad77d666311839f5665aeb2e42f64542");

    byte[] RealKey = GetKey(key, result);
    _key = Encoding.ASCII.GetString(RealKey);
    result.Key = RealKey;
    // result.IV = RealKey;
    return result;
}

private byte[] GetKey(byte[] suggestedKey, SymmetricAlgorithm p)
{
    byte[] kRaw = suggestedKey;
    List<byte> kList = new List<byte>();

    for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8)
    {
        kList.Add(kRaw[(i / 8) % kRaw.Length]);
    }
    byte[] k = kList.ToArray();
    return k;
}

/// <summary>
/// Encrpyts the sourceString, returns this result as an Aes encrpyted, BASE64 encoded string
/// </summary>
/// <param name="plainSourceStringToEncrypt">a plain, Framework string (ASCII, null terminated)</param>
/// <param name="passPhrase">The pass phrase.</param>
/// <returns>
/// returns an Aes encrypted, BASE64 encoded string
/// </returns>
public string EncryptString(string plainSourceStringToEncrypt, string passPhrase)
{
    //Set up the encryption objects
    using (AesCryptoServiceProvider acsp = GetProvider(Encoding.UTF8.GetBytes(passPhrase)))
    {
        byte[] sourceBytes = Encoding.UTF8.GetBytes(plainSourceStringToEncrypt);
        ICryptoTransform ictE = acsp.CreateEncryptor();

        //Set up stream to contain the encryption
        MemoryStream msS = new MemoryStream();

        //Perform the encrpytion, storing output into the stream
        CryptoStream csS = new CryptoStream(msS, ictE, CryptoStreamMode.Write);
        csS.Write(sourceBytes, 0, sourceBytes.Length);
        csS.FlushFinalBlock();

        //sourceBytes are now encrypted as an array of secure bytes
        byte[] encryptedBytes = msS.ToArray(); //.ToArray() is important, don't mess with the buffer
        var x = BitConverter.ToString(encryptedBytes);
        //return the encrypted bytes as a BASE64 encoded string
        return Convert.ToBase64String(encryptedBytes);
    }
}


/// <summary>
/// Decrypts a BASE64 encoded string of encrypted data, returns a plain string
/// </summary>
/// <param name="base64StringToDecrypt">an Aes encrypted AND base64 encoded string</param>
/// <param name="passphrase">The passphrase.</param>
/// <returns>returns a plain string</returns>
public string DecryptString(string base64StringToDecrypt, string passphrase)
{
    //Set up the encryption objects
    using (AesCryptoServiceProvider acsp = GetProvider(Encoding.UTF8.GetBytes(passphrase)))
    {
        byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
        ICryptoTransform ictD = acsp.CreateDecryptor();

        //RawBytes now contains original byte array, still in Encrypted state

        //Decrypt into stream
        MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);
        CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
        //csD now contains original byte array, fully decrypted

        //return the content of msD as a regular string
        return (new StreamReader(csD)).ReadToEnd();
    }
}
Maarten Bodewes

좋습니다. 설명에 따르면 키는 0 바이트로 채워집니다. 실제로 키 바이트를 반복하고 있습니다. 물론 두 방법 모두 완전히 안전하지 않으며 키는 임의의 바이트로 구성되어야합니다.

IV는 SHA-1을 사용하여 패딩되기 전에 키 바이트에 대해 계산되는 것 같습니다. 나는 당신의 코드에서 그것에 대해 아무것도 보지 못합니다. IV는 동일한 키가 사용될 때마다 변경되어야하며 따라서 키에 SHA-1을 사용하는 것은 안전하지 않습니다.

패딩은 블록 크기까지 제로 패딩입니다. 즉, 일반 텍스트가 00 바이트로 끝나면 데이터가 손실됩니다. 패딩은 언급되지 않았지만 무언가를 암호화 한 다음 동일한 키로 해독하여 테스트했습니다. 패딩 바이트가 아직있는 것 같습니다. 이것은 안전하지 않지만 잘못된 일반 텍스트로 이어질 수 있으므로 확실히 잘못된 것입니다.

추가 된 인증 태그 (예 : HMAC)가 없습니다. 즉, 누구나 암호문을 변경하고이를 사용할 수 있습니다. 최상의 경우 이것은 다른 시스템의 쓰레기로 이어질 것입니다. 최악의 경우 (그리고 이것은 대부분의 경우) 기밀성을 완전히 잃게됩니다. 이것은 아마도 당신이 처음에 달성하려고 한 것입니다.

학습 목적 또는 주어진 코드에서 마이그레이션하기위한 구현을 만들기위한 충분한 포인터를 제공했으면합니다. 인터넷에서 임의의 쓰레기를 사용하는 경우 (다른 단어가 아님) 그러나 보안이 0이됩니다. 나는 이것이 확산되는 것을 원하지 않기 때문에 코드를 제공하지 않을 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

키 크기가 128 인 CryptoJS를 사용하여 AES에서 암호화하는 방법은 무엇입니까?

분류에서Dev

AES 암호 해독 방법이 IV를 인수로 사용하는 이유

분류에서Dev

Android에서 256 비트 AES 암호화를 사용하는 방법

분류에서Dev

온라인 계산기는 상호 운용이 불가능하므로 AES-256을 사용하여 암호화를 수행하는 방법은 무엇입니까?

분류에서Dev

RSA 암호화를 사용하여 C ++에서 대용량 데이터를 암호화하는 방법

분류에서Dev

Crypto ++에서 RSA OAEP SHA-256을 사용하여 데이터를 암호화 / 복호화하는 방법

분류에서Dev

AES (openssl)를 사용하여 데이터를 암호화하는 방법은 무엇입니까?

분류에서Dev

온라인에서 사용자를 확인하는 방법

분류에서Dev

온라인에서 사용자를 확인하는 방법

분류에서Dev

브라우저에서 Node와 CryptoJS간에 AES 암호화를 사용할 때 발생하는 문제

분류에서Dev

라 라벨 7 / PHP 7에서 RIJNDAEL 암호화를 사용하는 방법

분류에서Dev

임의의 길이 암호를 사용하는 Java의 AES 암호화

분류에서Dev

React Native에서 데이터를 암호화하는 방법 (Expo 사용)

분류에서Dev

PHP에서 교환 암호화를 사용하는 방법이 있습니까?

분류에서Dev

RSA / AES를 사용하여 더 큰 파일을 암호화 / 복호화하는 방법

분류에서Dev

Java SE에서 암호화에 인증서를 사용하는 방법

분류에서Dev

Node.js Crypto aes256 Cipher를 암호화-복호화하는 방법

분류에서Dev

[SSIS 구성] 테이블에 저장된 암호를 암호화하는 방법

분류에서Dev

Delphi에서 AES-256 GCM으로 암호화하는 방법

분류에서Dev

암호화 된 암호없이 Adonis에서 "인증"을 사용하는 방법은 무엇입니까?

분류에서Dev

Pixlr Editor 또는 imagemagick과 같은 온라인 도구를 사용하여 이미지 주위에 공백을 추가하는 방법은 무엇입니까?

분류에서Dev

온라인 서버에서 데이터를 가져올 때 진행률 표시 줄을 사용하는 방법

분류에서Dev

Manjaro 전체 디스크 암호화에서 Luks 암호화 난이도를 변경하는 방법

분류에서Dev

AES-256에서 암호 복구 암호화되지 않은 파일을 통해 암호화 된 Zip 아카이브를 압축 하시겠습니까?

분류에서Dev

죽은 노트북의 암호화 된 하드 드라이브에서 데이터를 복구하는 방법은 무엇입니까?

분류에서Dev

Crypto ++에서 AES 암호화를 사용하는 키에 std :: string 사용

분류에서Dev

온라인 영화 대여 서비스를 사용하는 방법

분류에서Dev

온라인 영화 대여 서비스를 사용하는 방법

분류에서Dev

AES 암호화에 사용할 16,24,32 바이트를 만들기 위해 RAW의 바이트 수를 세는 방법

Related 관련 기사

  1. 1

    키 크기가 128 인 CryptoJS를 사용하여 AES에서 암호화하는 방법은 무엇입니까?

  2. 2

    AES 암호 해독 방법이 IV를 인수로 사용하는 이유

  3. 3

    Android에서 256 비트 AES 암호화를 사용하는 방법

  4. 4

    온라인 계산기는 상호 운용이 불가능하므로 AES-256을 사용하여 암호화를 수행하는 방법은 무엇입니까?

  5. 5

    RSA 암호화를 사용하여 C ++에서 대용량 데이터를 암호화하는 방법

  6. 6

    Crypto ++에서 RSA OAEP SHA-256을 사용하여 데이터를 암호화 / 복호화하는 방법

  7. 7

    AES (openssl)를 사용하여 데이터를 암호화하는 방법은 무엇입니까?

  8. 8

    온라인에서 사용자를 확인하는 방법

  9. 9

    온라인에서 사용자를 확인하는 방법

  10. 10

    브라우저에서 Node와 CryptoJS간에 AES 암호화를 사용할 때 발생하는 문제

  11. 11

    라 라벨 7 / PHP 7에서 RIJNDAEL 암호화를 사용하는 방법

  12. 12

    임의의 길이 암호를 사용하는 Java의 AES 암호화

  13. 13

    React Native에서 데이터를 암호화하는 방법 (Expo 사용)

  14. 14

    PHP에서 교환 암호화를 사용하는 방법이 있습니까?

  15. 15

    RSA / AES를 사용하여 더 큰 파일을 암호화 / 복호화하는 방법

  16. 16

    Java SE에서 암호화에 인증서를 사용하는 방법

  17. 17

    Node.js Crypto aes256 Cipher를 암호화-복호화하는 방법

  18. 18

    [SSIS 구성] 테이블에 저장된 암호를 암호화하는 방법

  19. 19

    Delphi에서 AES-256 GCM으로 암호화하는 방법

  20. 20

    암호화 된 암호없이 Adonis에서 "인증"을 사용하는 방법은 무엇입니까?

  21. 21

    Pixlr Editor 또는 imagemagick과 같은 온라인 도구를 사용하여 이미지 주위에 공백을 추가하는 방법은 무엇입니까?

  22. 22

    온라인 서버에서 데이터를 가져올 때 진행률 표시 줄을 사용하는 방법

  23. 23

    Manjaro 전체 디스크 암호화에서 Luks 암호화 난이도를 변경하는 방법

  24. 24

    AES-256에서 암호 복구 암호화되지 않은 파일을 통해 암호화 된 Zip 아카이브를 압축 하시겠습니까?

  25. 25

    죽은 노트북의 암호화 된 하드 드라이브에서 데이터를 복구하는 방법은 무엇입니까?

  26. 26

    Crypto ++에서 AES 암호화를 사용하는 키에 std :: string 사용

  27. 27

    온라인 영화 대여 서비스를 사용하는 방법

  28. 28

    온라인 영화 대여 서비스를 사용하는 방법

  29. 29

    AES 암호화에 사용할 16,24,32 바이트를 만들기 위해 RAW의 바이트 수를 세는 방법

뜨겁다태그

보관