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();
}
}
좋습니다. 설명에 따르면 키는 0 바이트로 채워집니다. 실제로 키 바이트를 반복하고 있습니다. 물론 두 방법 모두 완전히 안전하지 않으며 키는 임의의 바이트로 구성되어야합니다.
IV는 SHA-1을 사용하여 패딩되기 전에 키 바이트에 대해 계산되는 것 같습니다. 나는 당신의 코드에서 그것에 대해 아무것도 보지 못합니다. IV는 동일한 키가 사용될 때마다 변경되어야하며 따라서 키에 SHA-1을 사용하는 것은 안전하지 않습니다.
패딩은 블록 크기까지 제로 패딩입니다. 즉, 일반 텍스트가 00 바이트로 끝나면 데이터가 손실됩니다. 패딩은 언급되지 않았지만 무언가를 암호화 한 다음 동일한 키로 해독하여 테스트했습니다. 패딩 바이트가 아직있는 것 같습니다. 이것은 안전하지 않지만 잘못된 일반 텍스트로 이어질 수 있으므로 확실히 잘못된 것입니다.
추가 된 인증 태그 (예 : HMAC)가 없습니다. 즉, 누구나 암호문을 변경하고이를 사용할 수 있습니다. 최상의 경우 이것은 다른 시스템의 쓰레기로 이어질 것입니다. 최악의 경우 (그리고 이것은 대부분의 경우) 기밀성을 완전히 잃게됩니다. 이것은 아마도 당신이 처음에 달성하려고 한 것입니다.
학습 목적 또는 주어진 코드에서 마이그레이션하기위한 구현을 만들기위한 충분한 포인터를 제공했으면합니다. 인터넷에서 임의의 쓰레기를 사용하는 경우 (다른 단어가 아님) 그러나 보안이 0이됩니다. 나는 이것이 확산되는 것을 원하지 않기 때문에 코드를 제공하지 않을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다