์ํธํ๋ฅผ ์ํ ๋ง์ ์ํธ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ํฉ๋๋ค. ์ค๋๋ ์ธํฐํ์ด์ค์ ํด๋์ค์ ํผํฉ์ ์ฝ๊ฐ ๋ถ๋ฆฌ๋์์ต๋๋ค. ๋ํ AEAD ์คํ์ผ ์ํธ๋ ์ถ๊ฐ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ํ์ํ๋ฏ๋ก ์ง์ํ์ง ์์ต๋๋ค. ํ์ฌ ๋์์ธ์ ํ ๋น๋๊ธฐ ์ฌ์ฐ๋ฉฐ ๋ฐํ๋๋ ๋ฐฐ์ด๋ก ์ธํด ํผํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์ํด ๊ตฌํ๋ ๋ฒ์ฉ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ์ด๊ฒ์ ํ์ฅ์ ํ์ฉํ๊ณ ์ ์ ๋ฉ์๋๊ฐ ์๋ ํด๋์ค๋ฅผ ๊ฐ์ง์ผ๋ก์จ ํ์ฅ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ํธ์ถ ์ฌ์ด์ ์ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. API๋ ๋ ๋ฎ์ ํ ๋น์ ํ์ฉํ๋๋ก ํด๋์ค ์ฌํ์ฉ์ ํ์ฉํด์ผ ํฉ๋๋ค(๋งค๋ฒ ์ ์ธ์คํด์ค๊ฐ ํ์ํ์ง ์๊ณ ๊ด๋ฆฌ๋์ง ์๋ ํค๋ฅผ ์ก์ ์ ์์). ์ถ์ ๋๋ ๋ฆฌ์์ค์ ๊ด๋ฆฌ๋์ง ์๋ ํน์ฑ์ผ๋ก ์ธํด ํด๋์ค๋ IDisposable์ ๊ตฌํํด์ผ ํฉ๋๋ค.
public abstract class Cipher : IDisposable
{
public virtual int TagSize { get; }
public virtual int IVSize { get; }
public virtual int BlockSize { get; }
public virtual bool SupportsAssociatedData { get; }
public abstract void Init(ReadOnlySpan<byte> key, ReadOnlySpan<byte> iv);
public abstract void Init(ReadOnlySpan<byte> iv);
public abstract int Update(ReadOnlySpan<byte> input, Span<byte> output);
public abstract int Finish(ReadOnlySpan<byte> input, Span<byte> output);
public abstract void AddAssociatedData(ReadOnlySpan<byte> associatedData);
public abstract int GetTag(Span<byte> span);
public abstract void SetTag(ReadOnlySpan<byte> tagSpan);
}
(์ /์ถ๋ ฅ ์์ค๋ IO ์์ค์ ๊ฐ์ ์ ํ์ ์ธ ์คํฌ ๊ธฐ๋ฐ ์คํธ๋ฆผ์ ๋๋ค)
using (var cipher = new AesGcmCipher(bitsize: 256))
{
cipher.Init(myKey, nonce);
while (!inputSource.EOF)
{
var inputSpan = inputSource.ReadSpan(cipher.BlockSize);
cipher.Update(inputSpan);
outputSource.Write(inputSpan);
}
cipher.AddAssociatedData(extraInformation);
cipher.Finish(finalBlockData);
cipher.GetTag(tagData);
}
์ฐธ์กฐ dotnet/corefx#7023
์ ์๋ API์ ๋ํ ๋น ๋ฅธ ํ๋จ ํผ๋๋ฐฑ(๋์์ด ๋๋๋ก ๋ ธ๋ ฅ):
Span<T>
๋ NetStandard2 ์ ์์ต๋๋ค.AEAD API ์จ์ ํจ์ ์ฆ๊ฑฐ๋ก ์ด๋ฌํ ์ ์๋ API์ ์ฒซ ๋ฒ์งธ ๊ตฌํ์ AES-GCM์ด ์๋๋ผ HMAC ํ๊ทธ๊ฐ ์๋ ํด๋์/๊ธฐ๋ณธ AES-CBC ์ฌ์ผ ํฉ๋๋ค . ๊ฐ๋จํ ์ด์ ๋ ๋๊ตฌ๋ ํ์ฌ ์ ์๋ ค์ง ๊ฐ๋จํ ๊ธฐ์กด .NET ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ AES-CBC+HMAC AEAD ๊ตฌํ์ ๊ตฌ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ก์ด AEAD API์ ๋ํด ์์ ํ๋ ์ง๋ฃจํ ์ด์ [AES-CBC+HMAC]๋ฅผ ๋จผ์ ๊ตฌํด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ๋ ์ฌ๋์ด MVP ๋ฐ ํ ์คํธ ๋๋ผ์ด๋ธ๋ฅผ ํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค.
nonce/IV ์ด๋ฆ ์ง์ ๋ฌธ์ ๋ ๋ด๊ฐ ๊ฒฐ์ ํ์ง ๋ชปํ ๋ฌธ์ ์์ผ๋ฉฐ IV๋ก ๋ณ๊ฒฝ๋์ด ๋ง์กฑํ๋ฏ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ๋๋ค.
๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ๋ Get ๋ฉ์๋์ ๊ฒฝ์ฐ ํ ๋น์ ๋ฐฉ์งํฉ๋๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ๋ ์ค๋ฒ๋ก๋ Get()์ด ์์ ์ ์์ต๋๋ค. ์ด๋ฆ ๋ณ๊ฒฝ์ด ํ์ํ ์๋ ์์ง๋ง ์ ์ฒด API๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋น์ด ์์ด์ผ ํ๋ค๋ ์๊ฐ์ ๊ฝค ๋์ํ์ต๋๋ค.
์คํธ๋ฆผ ๋ฑ์ ๊ฒฝ์ฐ ํ์ ์์ค ๊ธฐ๋ณธ ์์์์ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋ ์์ ์์ค API์ด๋ฏ๋ก ํฌ๊ฒ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.
์๋ฃํ๊ธฐ ์ ์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ฉ๋์ง ์์์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฃ๋ฅผ ํธ์ถํ ์์ ์ ์์์ผ ํ๋ฏ๋ก API์ ์์ด์ผ ํ๋์ง ํ์ ํ ์ ์์ง๋ง ์ ์๋ ๋์์ด์ด์ผ ํ๋ฏ๋ก ๋ค์์ ํฌํจํ๋๋ก API ๋์์ธ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ํ๋ ์น์ ์ ํตํด ์๊ฐ๋๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ์บก์ฒํ ์ ์์ต๋๋ค.
์ด๋ค ์ํธ์ ๊ดํด์๋ ํน์ ์ํธ๊ฐ ์ ์ผํ ๋ชฉํ๊ฐ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์๋ก์ด ๋ฒ์ฉ API๋ฅผ ์ฆ๋ช ํ๋ ค๋ฉด ์ซ์์ ๋ง์์ผ ํฉ๋๋ค. AES GCM ๋ฐ CBC๋ ๋ชจ๋ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค.
(์ฃผ์ ํผ๋๋ฐฑ์ ๋ํ ๋ชจ๋ ๊ฒ์ด ์ข๋ ๋์๋ ํญ์ ๋์์ด ๋ฉ๋๋ค! )
@Drawaes ์ด API์์ ๊ณต์ ๊ตด๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ช ๊ฐ์ง ์๊ฐ:
@bartonjs
MyKeyStore.GetCipher();
์ด๊ธฐํ๋์ง ์์์ต๋๋ค. ์ผํ์ฉ์ด๋ฏ๋ก ์ผ๋ฐ ์ผํ์ฉ ํจํด์ผ๋ก ๋ชจ๋ ์ฌํ์ ์ญ์ ํ ์ ์์ต๋๋ค. ํค๋ฅผ ์ค์ ํ๋ ค๊ณ ํ๋ฉด ์๋ชป๋ ์์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์, ์ฝ๊ธฐ ์ ์ฉ ๋ฒ์์ ๋ํด์๋ ํด๋์ ํ๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ ์กฐ์ ํ ๊ฒ์ ๋๋ค.
@morganbr ๋ฌธ์ ์์ด์... ๋ฌด์๋ณด๋ค ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋๊ธธ ๋ฐ๋ ๋ฟ์ ๋๋ค ;)
ํ์ฌ ๋ด์ฉ์๋ ๊ด์ฌ์ด ๊ฑฐ์ ์์ต๋๋ค. ๋๋ฌด ํผ๋์ค๋ฌ์์ ๋ชจ๋ ํฉ๋ฆฌ์ ์ธ ์ต์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ก ํจ์นํ ๊ฒ์ ๋๋ค(3DES๋ ๋ค๋ฅธ ํด๋์ค์ ๋จ๊ฒจ๋์ธ์)
๋ฌธ์ ๋ EnvelopedCms(๋๋ EncryptedXml)์ ๊ฐ์ ์ปจํ ์ด๋ ํ์์ด 3DES-CBC, AES-CBC ๋ฑ๊ณผ ํจ๊ป ์๋ํด์ผ ํ ์๋ ์๋ค๋ ๊ฒ์ ๋๋ค. ECIES/AES-256-CBC-PKCS7/HMAC-SHA-2๋ก ์ํธํ๋ ๊ฒ์ ํด๋ ํ๋ ค๋ ๋๊ตฐ๊ฐ -256์ ์๋ง๋ ๊ทธ๋ค์ด ์ค๋๋๊ณ ์ถ์กํ ์ผ์ ํ๊ณ ์๋ค๊ณ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค.
AE๋ง์ ์ํ ๊ฒ์ด๋ผ๋ฉด ์ด๋ฆ ์ด๋๊ฐ์ ๋ฐ์๋์ด์ผ ํฉ๋๋ค. ์ง๊ธ์ ์ผ๋ฐ์ ์ธ "์ํธํ"์ ๋๋ค(์ ๋ ์ด๋ ์์ ์์ ์ฌ์ /์ฉ์ด์ง๊ณผ ํจ๊ป ์์์ "์๋ ๋ชจ๋์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ"์ด๋ผ๋ ๋จ์ด๊ฐ ์๋์ง ์์๋ผ ๊ฒ์ ๋๋ค. "์ํธ" == "์๊ณ ๋ฆฌ์ฆ", ๋ฐ๋ผ์ "Aes").
:) ๋๋ ๊ทธ๊ฒ์ด ๋ด ์ฃผ์ ์์ญ์ด ์๋๊ฑฐ๋ ๋์๊ฒ ๋ง์ ๊ด์ฌ์ด ์๋ค๋ ๊ฒ์ ์ง์ ํ ๊ฒ๋ฟ์ด๋ฏ๋ก ์ด ์ฃผ์ ์ ๋ํด ๊ทํ์ ์ปค๋ฎค๋ํฐ์ ๊ธฐ๊บผ์ด ๋ฏธ๋ฃจ๊ณ ์ ํฉ๋๋ค.
์ด๋ค์ ๋น ๋ฅด๊ฒ ์ค์บํ ํ ํ ๊ฐ์ง ์ต์ ์ "Cipher" ๋๋ ํด๋์ค๋ผ๊ณ ํ๋ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฒซ ๋ฒ์งธ ๋ฌผ๊ฒฐ์์ ์ํ๋์ง ์์ ์ ์์ง๋ง ๋น ๋ฅด๊ฒ ํ์ ์กฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค. API๊ฐ ๋งค์ฐ ํจ์จ์ ์ด๋ผ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์์ฒด ์์ ์ ์ํํด์ผ ํ ์ด์ ๊ฐ ์์ผ๋ฉฐ ์ ํํ ์ด API์ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
๋ค์ด๋ฐ์ ๋ํ ์ฌ์ด๋ ๋ฐ๋ก์ ... ๋๋ ๊ทธ๊ฒ์ด ํ๋ ๊ฒ์ ์ธ์ ํด์ผํฉ๋๋ค.
Openssl = ์ํธ
๋ฃจ๋น = ์ํธ
Go = AEAD ๋ฑ์ ์ํ ๋ํ์
์ธํฐํ์ด์ค๊ฐ ์๋ ์ํธ ํจํค์ง
์๋ฐ = ์ํธ
์ด์ ๋๋ ๋ฌ๋ผ์ผ ํ์ง๋ง... ํธ๋ ๋๊ฐ ์์ต๋๋ค. ๋ ๋์ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ฉ์ง๋ค.
์๋ง๋ "BlockModeCipher" ... ?
๋ช ๊ฐ์ง๋ฅผ ๋ณ๊ฒฝํ๋๋ฐ ๋ ๋์ ์ด๋ฆ์ด ๊ฒฐ์ ๋๋ฉด ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ฒ ์ต๋๋ค.
์ง๋ฌธ์ ๋ตํ๋ ค๊ณ ํ์ ๋ API์ ์ด๋ฏธ ์ํธํ/๋ณตํธํ ๊ตฌ๋ถ์ด ๋๋ฝ๋์ด ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ทํ์ ์์์๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ ์ง ๋ณตํธํํ ์ง ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ฃ์ผ๋ฉด ์ฝ๊ฐ์ ๋ช ํ์ฑ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
API๊ฐ ์ ์ ํ ํ๊ทธ ์ฌ์ฉ์ ์ ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ํ ์ ์์ต๋๋ค(์ด๋ฏธ SymmetricAlgorithm/ICryptoTransform/CryptoStream์ด ์์ผ๋ฏ๋ก ๋์นญ ์ํธํ๊ฐ ์๋๋ผ AEAD API๋ผ๊ณ ๊ฐ์ ). ํ๊น
์ ์ํํ๋ ์๋ก์ ์ด๊ฒ์ ๊ท๋ฒ์ ์ธ ๊ฒ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค.
๋ฐฉ๋ฒ์ผ๋ก:
class Cipher
{
void InitializeEncryption(ReadOnlySpan<byte> key, ReadOnlySpan<byte> iv);
// Ensures decryptors get a tag
void InitializeDecryption(ReadOnlySpan<byte> key, ReadOnlySpan<byte> iv, ReadOnlySpan<byte> tag);
// Ensure encryptors produce a tag
void FinishEncryption(ReadOnlySpan<byte> input, Span<byte> output, Span<byte> tag);
// Throws if tag didn't verify
void FinishDecryption(ReadOnlySpan<byte> input, Span<byte> output);
// Update and properties are unchanged, but GetTag and SetTag are gone
}
์์ ๋ณ:
class Cipher
{
// Has properties and update, but Initialize and Finish aren't present
}
class Encryptor : Cipher
{
void Initialize(ReadOnlySpan<byte> key, ReadOnlySpan<byte> iv);
void Finish(ReadOnlySpan<byte> input, Span<byte> output, Span<byte> tag);
}
class Decryptor : Cipher
{
void Initialize(ReadOnlySpan<byte> key, ReadOnlySpan<byte> iv, ReadOnlySpan<byte> tag);
// Throws if tag didn't verify
void Finish(ReadOnlySpan<byte> input, Span<byte> output);
}
class AesGCMEncryptor : Encryptor {}
class AesGCMDecryptor : Decryptor {}
}
์ฆ, ์ํธ ํด๋ ์ ๋ฒํผ๋ง๋์ง ์๋ ๊ฒฝ์ฐ ์ํธ ํด๋ ์ด ์ค์ ๋ก ์๋ฃ๋๊ณ ํ๊ทธ๊ฐ ํ์ธ๋๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ฉ์ ์ ๋๊น? ์ ๋ฐ์ดํธ๊ฐ ํ์ธํ ์๊ฐ์์ ์ด๋ป๊ฒ๋ ์์๋ผ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ด Dispose๊ฐ ํด์ผ ํ ์ผ์ ๋๊น? (Dispose๋ ๊ฐ์ฒด๋ฅผ ํ๊ธฐํ ๋ ์ด๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ ๋ขฐํ์ ์ ์์ผ๋ฏ๋ก ์ฝ๊ฐ ์ํํฉ๋๋ค.)
๋ช ๋ช ์ ๊ดํ ํ ์ฐ๋ฆฌ์ ์ ๋ก๋ SymmetricAlgorithm ๋ฐ AsymmetricAlgorithm์ ๋๋ค. ์ด๊ฒ์ด AEAD๋ฅผ ์ํ ๊ฒ์ด๋ผ๋ฉด ์ผ๋ถ ์์ด๋์ด๋ AuthenticatedSymmetricAlgorithm ๋๋ AuthenticatedEncryptionAlgorithm์ผ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์๊ฐ ๋ฐ API ์์ด๋์ด:
public interface IAEADConfig
{
// size of the input block (plaintext)
int BlockSize { get; }
// size of the output per input-block;
// typically a multiple of BlockSize or equal to BlockSize.
int FeedbackSize { get; }
// IV size; CAESAR completition uses a fixed-length IV
int IVSize { get; }
// CAESAR competition uses a fixed-length key
int KeySize { get; }
// CAESAR competition states that typical AEAD ciphers have a constant gap between plaintext length
// and ciphertext length, but the requirement is to have a constant *limit* on the gap.
int MaxTagSize { get; }
// allows for AE-only algorithms
bool IsAdditionalDataSupported { get; }
}
public interface ICryptoAEADTransform : ICryptoTransform
{
// new AEAD-specific ICryptoTransform interface will allow CryptoStream implementation
// to distinguish AEAD transforms.
// AEAD decryptor transforms should throw on auth failure, but current CryptoStream
// logic swallows exceptions.
// Alternatively, we can create a new AEAD_Auth_Failed exception class, and
// CryptoTransform is modified to catch that specific exception.
}
public interface IAEADAlgorithm : IDisposable, IAEADConfig
{
// separates object creation from initialization/keying; allows for unkeyed factories
void Initialize(ArraySegment<byte> key);
void Encrypt(
ArraySegment<byte> iv, // readonly; covered by authentication
ArraySegment<byte> plaintext, // readonly; covered by authentication
ref ArraySegment<byte> ciphertext, // must be of at least [plaintext_length + MaxTagSize] length. iv is not part of ciphertext.
ArraySegment<byte> additionalData = default(ArraySegment<byte>) // readonly; optional; covered by authentication
); // no failures expected under normal operation - abnormal failures will throw
bool Decrypt(
ArraySegment<byte> iv, // readonly
ArraySegment<byte> ciphertext, // readonly
ref ArraySegment<byte> plaintext, // must be of at least [ciphertext_length - MaxTagSize] length.
ArraySegment<byte> additionalData = default(ArraySegment<byte>), // readonly; optional
bool isAuthenticateOnly = false // supports Authentication-only mode
);// auth failures expected under normal operation - return false on auth failure; throw on abnormal failure; true on success
/* Notes:
* Array.LongLength should be used instead of Array.Length to accomodate byte arrays longer than 2^32.
* Ciphertext/Plaintext produced by Encrypt()/Decrypt() must be determined *only* by method inputs (combined with a key).
- (ie. if randomness or other hidden inputs are needed, they must be a part of iv)
* Encrypt()/Decrypt() are allowed to write to ciphertext/plaintext segments under all conditions (failure/success/abnormal)
- some implementations might be more stringent than others, and ex. not leak decrypted plaintext on auth failures
*/
ICryptoAEADTransform CreateEncryptor(
ArraySegment<byte> key,
ArraySegment<byte> iv,
ArraySegment<byte> additionalData = default(ArraySegment<byte>)
);
ICryptoAEADTransform CreateDecryptor(
ArraySegment<byte> key,
ArraySegment<byte> iv,
ArraySegment<byte> additionalData = default(ArraySegment<byte>)
);
// Streaming AEAD can be done with good-old CryptoStream
// (possibly modified to be AEAD-aware).
}
@sdrapkin , ์๊ฐ์ ์ ๊ณตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. API์์ ํ๊ทธ๋ ์ด๋์ ์์ด์ผ ํฉ๋๊น? ์๋ฌต์ ์ผ๋ก ์ํธ๋ฌธ์ ์ผ๋ถ์ ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ผ๋ถ ์๊ณ ๋ฆฌ์ฆ์๋ ์ค์ ๋ก ์๋ ํ๋กํ ์ฝ์ด ์์์ ์๋ฏธํฉ๋๋ค. ์์์ ํ๊ทธ ๋ฐฐ์น๊ฐ ํ์ฉ๋๋์ง ๋๋ ๋ณ๋๋ก ์ํํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฌ๋๋ค์ด ๊ด์ฌ์ ๊ฐ์ง ์ ์๋ ํ๋กํ ์ฝ์ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
@morganbr ์ํธํ/์ํธ ํด๋ ๋ฌธ์ ๋ ๋ฐ๊ฒฌํ์ง๋ง ์ค๋ ๋ฐค์ ์์ ํ ์๊ฐ์ด ์์์ต๋๋ค. ๋๋ ๋ ์ ๊ทน์ ์ธ ์ฌํ์ฉ์ ํ์ฉํ๋ฏ๋ก ํด๋์ค๋ณด๋ค ๋ฐฉ๋ฒ์ ์ ํธํฉ๋๋ค(ํค ๋ฐ IV์ ๋ํ ๋ฒํผ๊ฐ ์ถ๊ฐ๋ ์ ์์).
์ฒ๋ถ์ ์ ํ์ธ๋. ๋ถํํ๋ ์์ ์ ๋์ ๋งํ ์ ์์ต๋๋ค.
@sdrapkin ์ธํฐํ์ด์ค๋ ์์์ ์ธ๊ธํ ๋ฒ์ ๋ฌธ์ ๋ก ์ธํด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋ฏธ๋์ ๊ธฐ๋ณธ ์ด์์ ์์กดํ์ง ์๋ ํ. ๋ํ ์ธํฐํ์ด์ค ๋์คํจ์น๋ ๋ ๋๋ฆฝ๋๋ค. ๋ฐฐ์ด ์ธ๊ทธ๋จผํธ๋ ๋ฒ์๊ฐ ๋ ๋ค์ฌ๋ค๋ฅํ ํ์ ๊ธฐ๋ณธ ์์์ด๋ฏ๋ก ์ฐ๋ฆฌ์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋์ค์ ์์๊ฐ ์๋ ๊ฒฝ์ฐ arraysegment๊ฐ ํ์ฅ๋๋๋ก ํ์ฅ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ทํ์ ์์ฑ ์ค ์ผ๋ถ๋ ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ํด๋์ ํ๊ฐ ์๋ ์ปดํจํฐ์ ์์ ๋ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ข์ ํผ๋๋ฐฑ!
@morganbr ํ๊ทธ๋ ์ํธ๋ฌธ์ ์ผ๋ถ์ ๋๋ค. ์ด๊ฒ์ CAESAR API (AES-GCM ํฌํจ)๋ฅผ ๋ชจ๋ธ๋ก ํฉ๋๋ค.
@Drawaes ์ ๋ ์๊ฐ์ ์ค๋ช
ํ๊ธฐ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ ๋ ์ ์ ๋ฉ์๋/ํด๋์ค์ ๋ํด ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค. ๊ธฐ๊ฐ
์ ์ฉํ CAESAR API๋ฅผ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Span์ ๊ฒฝ์ฐ ์ด API์ ์ฒซ ๋ฒ์งธ ๊ตฌํ์ด ์ ๊ณต๋๋ ๊ฒ๊ณผ ๊ฐ์ ์๊ฐ(๋๋ ์ต์ํ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ)๊ณผ ๊ฐ์ 2.1 ์๊ฐ ํ๋ ์์ ๋ฐฐ์ก๋ฉ๋๋ค.
ํ์ฌ ์ํํ nuget ํจํค์ง๋ฅผ ์ดํด๋ณด๋ฉด .net ํ์ค 1.0๊น์ง ์ง์ํ๋ฉฐ ๋ฆด๋ฆฌ์ค ์ ๋ณ๊ฒฝํ ๊ณํ์ด ์์ต๋๋ค.
์ด์ฉ๋ฉด @stephentoub ๋ ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๊ฒ์ฒ๋ผ ํ๋ ์์ํฌ ์ ์ฒด์ Span ๊ธฐ๋ฐ API๋ฅผ ์ถ๊ฐํ๋ ์์ ์ ํ๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
(Span์ฉ Nuget)[https://www.nuget.org/packages/System.Memory/4.4.0-preview2-25405-01]
๊ทธ๋์ ์ ๋ ์ด๊ฒ์ด ์์ ํ ์๋ก์ด API๋ฅผ ์ํ ์ ์ผํ ์ง์ ํ ์ ํ์ด๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํํ ๊ฒฝ์ฐ ํ์ฅ ๋ฉ์๋ ๋ฑ์ ์ถ๊ฐํ์ฌ ArraySegment๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ถฉ๋ถํ ์ ์ฉํ๋ฉด ํ๋ ์์ํฌ์ ์ถ๊ฐํ ์ ์์ง๋ง ArraySegment๋ฅผ Span์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๊ฐ๋จํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์๋ ๋ฐ์ดํฐ ๋ณต์ฌ๊ฐ ํ์ํฉ๋๋ค.
์์ API์์ ๋ณผ ์ ์๋ ๋ฌธ์ ๋ "์ฒญํฌ" ๋ฐ์ดํฐ์ ์ฑ๋ฅ์ ์ฌ์์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋คํธ์ํฌ ํธ๋ํฝ์ ์๋ก ๋ค๋ฉด ์ธ์ฆ๋ ๋จ์ผ ๋ธ๋ก์ด ๊ธฐ์กด ์คํธ๋ฆผ์ ์ฌ๋ฌ ์ฝ๊ธฐ์ ๊ฑธ์ณ ๋ถํ ๋๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ชจ๋ ๋จ์ผ [๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฝ์ ]์ ๋ฒํผ๋งํ๊ณ ํ ๋ฒ์ ๋ชจ๋ ์ํธํ/๋ณตํธํํด์ผ ํฉ๋๋ค. ํด๋น ๋ฐ์ดํฐ์ ๋ํด ์ ๋ก ๋ณต์ฌ๋ฅผ ์ํํ๋ ค๋ ๋ชจ๋ ์๋๋ฅผ ๋ฌดํจํํฉ๋๋ค.
Pipelines๊ฐ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋คํธ์ํน ํ๋ ์์ํฌ๋ ๊ฑฐ์ ๋ชจ๋ ์ฌ๋ณธ์ ํผํ๋๋ก ๊ด๋ฆฌํ์ง๋ง ์ด API์์ ์ด๋ค ์ข ๋ฅ์ ์ํธํ์ ๋๋ฌํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ฌ๋ผ์ง๋๋ค.
๋ณ๋์ ๊ตฌ์ฑ ๊ฐ์ฒด(๋๋ ๊ฐ๋ฐฉ)๋ ์ค์ ๋ก ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ค๋ฅธ API์ ๋ํ ์ต๊ทผ ํ ๋ก ์ ํฌํจ๋์์ต๋๋ค. ์์ผ๋ก ์ปค์ง๋ฉด ๋ฉ์ธ ์ค๋ธ์ ํธ์ ๋ง์ ์์ฑ์ ๊ฐ์ง๊ฒ ๋๋ฉด ์๋ง์ด ๋ ์ ์๋ค๋ ์ ์์ ์์น์ ์ผ๋ก ๋ฐ๋ํ์ง ์์ต๋๋ค.
๋ช ๊ฐ์ง ์ผ์ด ๋์๊ฒ ์ผ์ด๋ฌ์ต๋๋ค.
์ปจํ ์ด๋ ํ์(EnvelopedCms, EncryptedXml)์ด ํค๋ฅผ ์ถ์ถํด์ผ ํ๋์ง ์๋๋ฉด ํค๋ฅผ ์์ฑํ๊ณ ๊ธฐ์ตํ๋ ๊ฒ์ด ๋จ์ํ ํค๋ฅผ ์์ฑํ๊ณ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํ ๊ฒ์ธ์ง(๊ธฐ๋กํด์ผ ํ๋ ํ) ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
(๋ถ๋ช ํ ์ด์ "๋๊ธ" ๋ฒํผ์ ๋๋ฅด์ง ์์์ผ๋ฏ๋ก 1910Z์์ "๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ต๋๋ค" ์ดํ์๋ ์๋ฌด ๊ฒ๋ ์น์ธํ์ง ์์ต๋๋ค.)
์ค์ ํ๊ทธ ํฌ๊ธฐ๋ ๊ฐ๋ณ์ ์ด์ด์ผ ํฉ๋๋ค. ๋์.
์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์ง๊ธ์ ์ํธํ๋ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ผ๋ถ ์ํธ๋ ๋ ์ ๊ฑฐ๋ ๋ ๋ง์ ๊ฒ์ ๋ฐํํ์ง ์๋๋ค๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์ถฉ๋ถํ ํฐ ๋ฒํผ๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์ง์ ๋ํ ์ผ๋ฐ์ ์ธ ์ง๋ฌธ์ด ์์ต๋๋ค.
span์ ์ฌ์ฉํ๋ ์๋ก์ด TextEncoding ์ธํฐํ์ด์ค์๋ ์ถ๋ ฅํ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ด๊ฑฐํ์ ๋ฐํํ๊ณ ๋์ ์ค์ ๋ก "out" ๋งค๊ฐ๋ณ์์ ํฌ๊ธฐ๋ฅผ ์ฐ๋ ๊ฒ์ ๋ํ ์ ์์ด ์์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ๋ฅ์ฑ์ ๋๋ค.
CCM์ ๊ฒฝ์ฐ ์๋ฌด ๊ฒ๋ ๋ฐํํ์ง ์๊ณ ์ ์ฒด ๋กํธ๋ฅผ ๋คํํ๋ ค๋ ์์ ์์ finish๋ฅผ ํธ์ถํ ๋๊น์ง ๋ด๋ถ์ ์ผ๋ก ๋ฒํผ๋งํด์ผ ํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋จ์ผ ๋ธ๋ก์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ(์ด ๊ฒฝ์ฐ ๋ ๋์ ์ด๋ฆ์ด ์์ ์ ์์) ์ฒซ ๋ฒ์งธ ํธ์ถ๋ก finish๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ง์ ์ ์๋ ๊ฒ์ ์์ต๋๋ค. ๋๋ ํด๋น ์ํธ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ์๋ํ๋ฉด ๋์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด CCM์์ ๊ณ์ ์์ ์ ์๋ํ๋ฉด CNG๊ฐ ์๋ชป๋ ํฌ๊ธฐ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
ํ๊ทธ๊ฐ ๋ณตํธํ์ ์ค์ ๋ ๊ฒฝ์ฐ ์ ์ฒด ํจํท์ ์ฝ์ ๋๊น์ง ์ข ์ข ์์ง ๋ชปํฉ๋๋ค. TLS๋ฅผ ์๋ก ๋ค๋ฉด ํ๊ทธ ๋์ ๋๋ฌํ๊ธฐ ์ํด 8 * 2k ๋คํธ์ํฌ ํจํท์ ์ฝ์ด์ผ ํ ์ ์์ต๋๋ค. 16k ๋ธ๋ก์. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด์ ํด๋ ์ ์์ํ๊ธฐ ์ ์ ์ ์ฒด 16k๋ฅผ ๋ฒํผ๋งํด์ผ ํ๋ฉฐ ์ค์ฒฉ๋ ๊ธฐํ๊ฐ ์์ต๋๋ค. ํ๋ก๋ง).
@Drawaes re. ์ฒญํฌ ์คํธ๋ฆผ ๋ฐ ๋ฒํผ๋ง ์ ํ:
๋น์ ์ ๋น์ ์ ์ ํฌ๋ฅผ ์ ํํด์ผํฉ๋๋ค. AE ์ธ๊ณ์์ ํ๋์ ์ข์ ๋ชฉํ์ ์ผ์นํ๋ ํตํฉ API๋ฅผ ๋ง๋ค ์๋ ์์ผ๋ฉฐ ๊ทธ๋ฌํ ๋ชฉํ๊ฐ ๋ง์ด ์์ต๋๋ค. ์ . Inferno ์๋ ์ ์ ํ ์ฒญํฌ AEAD ์คํธ๋ฆฌ๋ฐ์ด ์์ง๋ง ์ด๋ ํ์ค์ด ์๋๋ฉฐ ๊ทธ๋ฌํ ํ์ค๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ ๋์ ์์ค์์ ๋ชฉํ๋ "๋ณด์ ์ฑ๋"์
๋๋ค( this , this ๋ฐ this ์ฐธ์กฐ).
๊ทธ๋ฌ๋ ์ง๊ธ์ ๋ ์๊ฒ ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ์ฒญํน/๋ฒํผ ์ ํ์ ํ์คํ ๋ ธ๋ ฅ์ ๋์์ด ๋์ง ์์ต๋๋ค(" AEADs with large plaintexts " ์น์ )..
์ํธํ/๋ณตํธํ ์์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณํ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ณํ์๋ ๋ฒํผ๊ฐ ํ์ํ๋ฉฐ ์ ์๋ฆฌ์ ์์ง ์์ต๋๋ค(์ถ๋ ฅ ๋ฒํผ๋ ์ ๋ ฅ ๋ฒํผ๋ณด๋ค โโ์ปค์ผ ํฉ๋๋ค - ์ต์ํ Encrypt ๋ณํ์ ๊ฒฝ์ฐ).
RFC 5116 ๋ ๊ด์ฌ์ ๊ฐ์ง ์ ์์ต๋๋ค.
@Drawaes , TLS๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ํฅ๋ฏธ๋กญ์ต๋๋ค. SSLStream(์ด API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ฒด์ ์ผ๋ก ๋ฐฉ์ดํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์ฆ๋์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐํํด์๋ ์ ๋๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
๋ฌผ๋ก , ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ SSLStreams ๋ฌธ์ ์ ๋๋ค. ๋๋ ํ์ดํ๋ผ์ธ ์์ ์ด ์ ํํ ๊ฒ(์ํธํ ๋นํธ์ ๋ํด CNG ๋ฐ OpenSSL์ ํธ์ถํ๋ ํ๋กํ ์ฝ ์์ค์์ ๊ด๋ฆฌ๋๋ TLS)์ ํ๋กํ ํ์ ์ ๋ง๋ค์์ต๋๋ค. ๋ ผ๋ฆฌ๋ ๋งค์ฐ ๊ฐ๋จํ์ต๋๋ค. ์ํธํ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๊ณ ๋ฒํผ๋ฅผ ์ ์๋ฆฌ์์ ํด๋ ํ๊ณ ์์๋ฐ์ด๋์ ์ฐ๊ฒฐํ๊ณ ํ๊ทธ์ ๋๋ฌํ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ํ๊ทธ ํธ์ถ์ด ๋๋๋ฉด...
๋์ง๋ฉด ํ์ดํ๋ผ์ธ์ ๋ซ์ต๋๋ค. ๋์ง์ง ์์ผ๋ฉด ๋ค์ ๋จ๊ณ๊ฐ ๋์ผํ ์ค๋ ๋์์ ๋๋ ๋์คํจ์น๋ฅผ โโํตํด ์๋ํ๋๋ก ํ๋ฌ์ํฉ๋๋ค.
๋ด ๊ฐ๋ ์ฆ๋ช ์ ํฉ๊ธ ์๊ฐ๋์ ์ค๋น๋์ง ์์์ง๋ง ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ๋ง์ ์ฌ๋ณธ ๋ฑ์ ํผํจ์ผ๋ก์จ ๋งค์ฐ ๊ด์ฐฎ์ ์ฑ๋ฅ ์ฆ๊ฐ๋ฅผ ๋ณด์์ต๋๋ค.)
๋คํธ์ํน์ ๋ฌธ์ ๋ ํ์ดํ๋ผ์ธ์ ์ฌ๋ฌผ์ด ์์ฒด ๋ฒํผ๋ฅผ ํ ๋นํ๊ธฐ ์์ํ๊ณ ์ด๋ฏธ ์์คํ ์ ํตํด ์ด๋ํ๋ ๋ฒํผ๋ฅผ ๊ฐ๋ฅํ ํ ๋ง์ด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๋๋ค.
OpenSsl์ crypt์ CNG๋ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก Update, Update, Finish๋ฅผ ์ฌ์ฉํฉ๋๋ค. Finish๋ ๋ ผ์๋ ๋๋ก ํ๊ทธ๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ ๋ฐ์ดํธ๋ ๋ธ๋ก ํฌ๊ธฐ(CNG์ ๊ฒฝ์ฐ)์ฌ์ผ ํ๋ฉฐ OpenSsl์ ๊ฒฝ์ฐ ๋ธ๋ก ํฌ๊ธฐ์ ๋๋ฌํ๊ธฐ ์ํด ์ต์ ๋ฒํผ๋ง์ ์ํํฉ๋๋ค.
๊ทธ๊ฒ๋ค์ ์์์ ์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๋ ๋์ ์์ค์ ๊ธฐ๋ฅ์ ๊ธฐ๋ํ ์ ์์์ง ํ์ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ๋ค์ ๊ตฌ์ฑํ๊ธฐ ์ํด ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์๋ "์ฌ์ฉ์" ๋ ๋ฒจ API๋ฅผ ์ค๊ณํ๋ค๋ฉด ํค ์์ฑ, IV ๊ตฌ์ฑ ๋ฐ ์ ์ฒด ์ธ์ฆ๋ ์ฒญํฌ๊ฐ ๋ชจ๋ ๊ตฌํ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ ๊ฒ์ด๋ฏ๋ก ์ด API์ ๋์ ๋ ๋ฒจ์ด ์ค์ ๋ก ๋ฌด์์ธ์ง์ ๋ฌ๋ ค ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ชป๋ ๋ฒํผ
@blowdart , ๋ ผ์ค ๊ด๋ฆฌ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ nonce ๊ด๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์ ๋ฌธ์ ์ด๋ฉฐ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๊ทธ๋์ ... ๊ทธ๊ฒ์ ์๊ตฌ ์ฌํญ์ผ๋ก ๋ง๋์ญ์์ค. ๋์ค ๊ด๋ฆฌ๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๊ณ ... ๊ธฐ๋ณธ ๊ตฌํ์ด๋ ๊ตฌํ์ ์ ํ ์ ๊ณตํ์ง ๋ง์ญ์์ค. ์ด๊ฒ์ ๋จ์ํ ๊ฒ๋ณด๋ค
cipher.Init(myKey, nonce);
์ฌ์ฉ์๊ฐ ์ํ์ ์ดํดํ๋ ํน์ ์ ์ค์ฒ๋ฅผ ์ทจํ๋๋ก ํฉ๋๋ค.
@blowdart ์ ์์ด๋์ด๋ ๋ ผ์ค ๊ด๋ฆฌ ๋ฌธ์ ์ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ์ฐจ์ด์ ๋ชจ๋์ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ nonce ๊ด๋ฆฌ๊ฐ ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ดํดํ๋๋ก ํ๊ธฐ ์ํด ๊ธฐ๋ณธ ์ ๊ณต ๊ตฌํ์ด ์๋ ๊ฒ์ด ์ค์ํ ์ ์๋ค๋ ์ ์ ๋์ํฉ๋๋ค. ์ด๋ป๊ฒ ์๊ฒผ์ต๋๊น?
interface INonceProvider
{
public void GetNextNonce(Span<byte> writeNonceHere);
}
class AesGcmCipher : Cipher
{
public AesGcmCipher(ReadOnlySpan<byte> key, INonceProvider nonceProvider);
}
// Enables platform-specific hardware keys
class AesGcmCng : Cipher
{
public AesGcmCng(CngKey key, INonceProvider nonceProvider);
}
// Example of AEAD that might not need a nonce
class AesCBCHmac : Cipher
{
public AesCBC(ReadOnlySpan<byte> key)
}
class Cipher
{
// As above, but doesn't take keys, IVs, or nonces
}
๊ทธ๋ฌ๋ INonceProvider์ ์์ ์ ๋ฌด์์ ๋๊น? Init๊ฐ ์๋ฌด ๊ฒ๋ ์ฌ์ฉํ์ง ์๊ณ ๋ธ๋ก์ ์์ํ๊ธฐ ์ ์ ํธ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ ์ถ๊ฐ ์ธํฐํ์ด์ค/์ ํ์ด ์์ผ๋ฉด ์ถ๊ฐ ์ธํฐํ์ด์ค/์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒ์ด ์๋๊ฐ์?
๋ํ ์ ๋ ์ํธ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง AES์๋ IV๊ฐ ํ์ํ์ง ์์ต๋๋ค(nonce๋ ์๋์ง๋ง ์ฌ์ฉ์๊ฐ ์ ๊ณตํด์ผ ํฉ๋๊น?)
์ถ๊ฐ ์ธํฐํ์ด์ค/์ ํ์ผ ๋ฟ์ ๋๋ค.
๊ทธ๊ฒ ์์ ์
๋๋ค. ๊ทธ๊ฒ์ ๋ณธ์ง์ ์ผ๋ก _nonce management_๊ฐ ๋ฌธ์ ๋ผ๊ณ ๋งํฉ๋๋ค. ๋จ์ํ 0 ๋๋ ์์์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ ๋ฌํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฌ๋๋ค์ด GetNextNonce
๋ฅผ "์ง๋๋ฒ์ ํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒ์ ๋ฐํ"ํ๋ ๊ฒ์ผ๋ก ํด์ํ๋ฉด ๋ถ์ฃผ์ํ ์ฌ์ฌ์ฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์๋ ์์ต๋๋ค.
nonce ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ์๋ ์๊ณ ๋ฆฌ์ฆ(์: AES SIV ๋๋ AES+CBC+HMAC)์๋ ํ์ํ์ง ์์ ๊ฒ๋ ๋์์ด ๋ฉ๋๋ค.
์ ํํ IV/nonce ์๊ตฌ ์ฌํญ์ ๋ชจ๋์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์๋ฅผ ๋ค์ด:
AES CBC๋ IV๊ฐ ํ์ํฉ๋๊น? ๊ทธ๋์ InitializationVectorProvider๊ฐ ์์ต๋๊น? ๋ฌ๊ธ์์ง๋ง
iv๋ฅผ ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์ nonce๋ฅผ ์ข์ํ๊ณ ๋ง์ง๋ง ๋ธ๋ก์ ์ฌ์ฌ์ฉํ๋ฉด tls ๊ณต๊ฒฉ์ด ๋ฐ์ํฉ๋๋ค. CBC์ ๋ํด say ์์ฐจ nonce๋ฅผ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์, ํ์ง๋ง IV๋ nonce๊ฐ ์๋๋ฏ๋ก nomce provider๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
AES CBC์ IV๊ฐ ํ์ํ์ง ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ํ์ํฉ๋๋ค. ๋๋ ๋จ์ง ๋ค๋ฅธ ๋ฐ์ดํฐ์์ IV๋ฅผ ๋์ถํ๋ ๋ช ๊ฐ์ง ๊ณํ์ ๋ํด ์ถ์ธกํ๊ณ ์ถ์์ต๋๋ค.
๋ฌผ๋ก ๋ด ์์ ์ ๋ด๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๊ฒ์ ์ข์ํ๋ค๋ ๊ฒ์ ๋๋ค ... ์ ๊ณต์๋ฅผ ํ๋ง ํ ์ ์์ต๋๋ค ;) ๊ทธ๋ฌ๋ iv ์ ๊ณต์๋ผ๊ณ ๋ถ๋ฅด๊ฑฐ๋ ์๋๋ฅผ ๋ช ํํ๊ฒ ํ 2 ๊ฐ์ ์ธํฐํ์ด์ค
@morganbr INonceProvider
์ํธ ์์ฑ์์ ์ ๋ฌ๋ ํฉํ ๋ฆฌ๋ ์๋ชป๋ ๋์์ธ์
๋๋ค. _nonce_๊ฐ ๊ทธ ์์ฒด๋ก ์กด์ฌํ์ง ์๋๋ค๋ ์ฌ์ค์ ์์ ํ ๋์น๊ณ ์์ต๋๋ค. "_... ํ๋ฒ ์ฌ์ฉ๋_" ์ ์ฝ ์กฐ๊ฑด์๋ _context_๊ฐ ์์ต๋๋ค. CTR ๋ฐ GCM(CTR ์ฌ์ฉ) ๋ชจ๋์ ๊ฒฝ์ฐ _nonce_์ _context_๋ _key_์
๋๋ค. ์ฆ. _nonce provider_๋ ํน์ _key_ ์ปจํ
์คํธ ๋ด์์ ํ ๋ฒ๋ง ์ฌ์ฉ๋๋ nonce๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
์ ์ํ API์ INonceProvider
๋ ํค๋ฅผ ์ธ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ nonce๋ฅผ ์์ฑํ ์ ์์ต๋๋ค(๋นํธ ๊ณต๊ฐ์ด ํต๊ณ์ ์์์ฑ์ด ์๋ํ๊ธฐ์ ์ถฉ๋ถํ ํฌ๋๋ผ๋ nonce๊ฐ ์๋ ์์์ฑ์ ํตํ ๊ฒ ์ ์ธ). ์์ ํ๊ฒ).
๋๋ ์ด ํ ๋ก ์ค๋ ๋๊ฐ ๋ฌ์ฑํ๊ณ ์ ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋ค์ํ Authenticated-Encryption ๋์์ธ ์์ด๋์ด๊ฐ ๋ ผ์๋ฉ๋๋ค... ok. ์ด๋ฏธ .NET Core, ํนํ ASP.NET API์ ๊ตฌ์ถ๋ ์ธ์ฆ๋ ์ํธํ ์ธํฐํ์ด์ค๋ ์ด๋ป์ต๋๊น? IAuthenticatedEncryptor ๋ฑ์ด ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด๋ฏธ ๊ตฌํ๋๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ํ์ฌ .NET Core์ ์ผ๋ถ๋ก ์ ๊ณต๋ฉ๋๋ค. DataProtection ์ํธํ๊ฐ ์๋ฒฝํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ์๋์ง๋ง ๋ฌด์ํ ๊ณํ์ ๋๊น? ๋ณ๊ฒฝํ์๊ฒ ์ต๋๊น? ๋ํ ๋๋ ๋ฆฌํฉํ ๋ง?
DataProtection ์ํธํ๋ @GrabYourPitchforks (Levi Broderick)๊ฐ ๊ตฌ์ถํ์ต๋๋ค. ๊ทธ๋ ์ฃผ์ ๋ฅผ ์๊ณ ์์ผ๋ฉฐ ๊ทธ์ ์๊ฒฌ/์ ๋ ฅ/ํผ๋๋ฐฑ์ด ์ด ์ปค๋ฎค๋ํฐ์ ๊ฐ์ฅ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ ๋ ๋๊ตฌ๋ณด๋ค ์ํธํํ ๊ด๋ จ ์ํฐํ ์ธ๋จผํธ๋ฅผ ์ข์ํ์ง๋ง, ์ํธํํ API ์ค๊ณ์ ๋ํด ์ง์งํ๊ฒ ๊ณ ๋ฏผํ๊ณ ์ถ์ ์ฌ๋์ด ์๋ค๋ฉด ์ด๋ฏธ MS ํ์ ์๋ ์ค์ ์ ๋ฌธ๊ฐ๋ค์ด ์ฐธ์ฌํด์ผ ํฉ๋๋ค.
@sdrapkin , ํค ์ธ์์ด ํ์ํ nonce ์ ๊ณต์๋ ์ข์ ์ง์ ์ ๋๋ค. ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ์ด๋ฌํ API๋ฅผ ์์ ํ๋ ํฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
DataProtection์ ํ๋ฅญํ API์ด์ง๋ง ๋ ๋์ ์์ค์ ๊ตฌ์ฑ์ ๋๋ค. ํค ์์ฑ ๋ฐ ๊ด๋ฆฌ, IV ๋ฐ ์ถ๋ ฅ ํ๋กํ ์ฝ์ ์บก์ํํฉ๋๋ค. ๋๊ตฐ๊ฐ ๋ค๋ฅธ ํ๋กํ ์ฝ์ ๊ตฌํ์์ GCM์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ DataProtection์ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ง ์์ต๋๋ค.
.NET ์ํธํ ํ์๋ @bartonjs , @blowdart ๋ฐ ์ ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฌผ๋ก @GrabYourPitchforks ๊ฐ ์ฐจ์๋ฒจ์ ์ธ๋ฆฌ๊ณ ์ถ๋ค๋ฉด ํ์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ฎ์ ์์ค์ ์์์ ์ด์ด์ผ ํ๋ค๋ ์ ์์ @morganbr ์ ๋์ํฉ๋๋ค(์ฌ์ค ์ ๋ชฉ์์ ๊ทธ๋ ๊ฒ ๋งํฉ๋๋ค). ๋ฐ์ดํฐ ๋ณดํธ ๋ฑ์ ์ฌ์ฉ์ ์ฝ๋์์ ์ง์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ด ๋ฐ์ ์ด์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์์ํค์ง๋ง, ๋ด๊ฐ ์ด ๊ธฐ๋ณธ ์์๋ฅผ ๋ณด๋ ๋ฐฉ์์ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ณตํต ๊ธฐ๋ฐ์์ ๋ ๋์ ์์ค์ ๊ตฌ์ฑ์ ๊ตฌ์ถํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ์๊ฐ์ ์ผ๋์ ๋๊ณ ํค๊ฐ ์ ๊ณต๋ ๋๋ง๋ค ์ ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ณต๊ธ์๋ ๊ด์ฐฎ์ต๋๋ค. TLS๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ช ํ๊ฒ ์ต๋๋ค(๋คํธ์ํฌ ํธ๋ํฝ์ AES ์ฐจ๋จ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ ์๋ ค์ ธ ์์).
๋๋ "ํ๋ ์"์ ์ป์ต๋๋ค (์ธํฐ๋ท์ MTU ~ 1500์ ์ฌ์ฉํ๋ 2 + TU ์ด์). ์ฌ๊ธฐ์๋ nonce(๋๋ 4๋ฐ์ดํธ๊ฐ "์จ๊น"์ผ๋ก ๋จ์ ์๋ nonce์ ์ผ๋ถ)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ๊ฐ์ ์ ธ "์ ๊ณต์"์์ ์ค์ ํ ๋ค์ ์ํธ ํด๋ ์ ํธ์ถํ๊ณ ๋ฒํผ ์ํธ ํด๋ ์ฃผ๊ธฐ๋ฅผ ๊ฑฐ์ณ ๋จ์ผ ์ผ๋ฐ ํ ์คํธ๋ฅผ ์ป์ต๋๋ค. .
๋น์ ์ด ๊ทธ๊ฒ์ ๋ง์กฑํ๋ค๋ฉด, ๋๋ ๊ทธ๊ฒ์ผ๋ก ์ด ์ ์์ต๋๋ค. ์์ ๋์์ธ์ ์ฐ๋ฆฌ๊ฐ ๋์ํ ์ ์๋ ๊ฒ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ด์ฌ์ธ ์ด ์์ ์ ์งํํ๊ณ ์ถ์ต๋๋ค.
ํ ๋ก ์ ์งํํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด์ ๋ํด ๋ ผ์ํ ์ ์๋ ์์ ์๊ฐ์ ๊ฐ์ง์ญ์์ค. @Drawaes , ์ด ์งํํ๋ ๋ํ์ ํฉ๊ธ ํ์ค/ํ๊ฒ์ผ๋ก ์ต์์ ๊ฒ์๋ฌผ์ ํ์ธ/์ ๋ฐ์ดํธํ ์ ์์ต๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธํ ์ ์์ต๋๊น?
ํ์ฌ ์ ์์ ์น๋ช ์ ์ธ ๋ฌธ์ ๊ฐ ์๊ณ ๋๋ฌด ์๋ค์ค๋ฌ์ด ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
// current proposed usage
using (var cipher = new AesGcmCipher(bitsize: 256))
{
cipher.Init(myKey, nonce);
while (!inputSource.EOF)
{
var inputSpan = inputSource.ReadSpan(cipher.BlockSize);
cipher.Update(inputSpan);
outputSource.Write(inputSpan);
}
cipher.AddAssociatedData(extraInformation); // <= fatal, one can't just do this
cipher.Finish(finalBlockData);
cipher.GetTag(tagData);
}
์ง์ ํ AEAD ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๋ณด๋ฉด ํ๋ผ์ด๋ฒ์ ๋ฐ์ดํฐ์ ์ธ์ฆ๋ ๋ฐ์ดํฐ๊ฐ ํผํฉ๋ ์ ๊ธ ๋จ๊ณ์ ๋๋ค. ์ธ์ฆ ๋ฐ์ดํฐ 1 ๋ฐ CipherText1์ ๋ํด์๋ ์ด๊ฒ์ ์ฐธ์กฐํ์ญ์์ค. ์ด๊ฒ์ ๋ฌผ๋ก 1๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ๋ธ๋ก์ ๋ํด ๊ณ์๋ฉ๋๋ค.
์ ์ธ๊ณ์ ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ํญ ํ ์ ์์ต๋๋ค, ์ฃ์กํฉ๋๋ค :)
๋ํ API๋ new, init, update ๋ฑ์ผ๋ก ์๋ค์ค๋ฌ์ ๋ณด์ ๋๋ค. ์ด ํ๋ก๊ทธ๋๋จธ์ ๋ชจ๋ธ์ ์ ์ํ๊ฒ ์ต๋๋ค.
// proposed, see detailed comments below
using (var cipher = new AesGcmCipher(myKey, iv, aad)) // 1
{
// 2
while (!inputSource.EOF)
{
var inputSpan = inputSource.ReadSpan(16411); // 3
var outSpan = cipher.Encrypt(inputSpan); // 4
outputSource.Write(outSpan);
}
var tag = cipher.Finish(finalBlockData); // 5
}
cipher.Init(mykey, nonce, aad);
๋ฅผ ๋ณด์์ต๋๋ค. (์: BCryptEncrypts์ CipherModeInfo ๋งค๊ฐ๋ณ์ ). ๋ํ myKey์ ํฌ๊ธฐ๋ ์ด๋ฏธ AES128, 192, 256์ ์ค์ ํ๋ฏ๋ก ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.tag
๋ ์ด ์๊ฐ์ ๊ฐ์ฅ ์ค์ํ ์ํ๋ ๋ฐ์ดํฐ์ด๋ ๋๋ ค์ฃผ์ธ์.์ฌ์ค ํ๋ฐ ๋ ๋์๊ฐ ์ ๊ทธ๋ฅ
using (var cipher = new AesGcmCipher(myKey, iv, aad))
{
var tag = cipher.EncryptFinal(inputSpan, outputSpan);
}
๋ํ INonceProvider
๋ฐ ๊ธฐํ ์ข
๋ฅ๋ฅผ ํผํ์ญ์์ค. ํฌ๋ฆฝํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ ์ด๊ฒ์ ํ์๋ก ํ์ง ์์ต๋๋ค byte[]
iv(์์ ๋ฐ์ดํฐ์ ๋ํด ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ) ๋๋ Span
(์๋ก์ด ๋ฉ์ง์ง๋ง ๋๋ฌด ๋ง์ ์ถ์ํ IMHO)๋ฅผ ๊ณ ์ํ์ญ์์ค. Nonce ๊ณต๊ธ์๋ ์์ ๊ณ์ธต์์ ์๋ํ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๋ ์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ iv
์ ์์ต๋๋ค.
ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๋๋ฌด ์์์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ฌธ์ ๋ ์ฌ๋๋ค์ด ๋จ์ํ ๊ทธ๊ฒ๋ค์ ์๋ชป ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ณต๊ธ์์ ํจ๊ป ์ฐ๋ฆฌ๋ ์ต์ํ ๊ทธ๋ค์ ์ฌ์ฉ์ ๋ํด ์ฝ๊ฐ์ ์๊ฐ์ ๊ฐ์ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก GCM์ด ํน์ ํ AEAD์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋จผ์ ์ผ๋ฐํ๋ ์ฌ๋ก( iv
)๊ฐ ํน์ ์ฌ๋ก( nonce
)๊ฐ ์๋๋ผ ๋์์ธ์ ์ฃผ๋ํด์ผ ํฉ๋๋ค.
๋์งธ, ๋จ์ํ byte[] iv
์์ GetNextNonce(Span<byte> writeNonceHere)
๋ก ์ด๋ํ๋ ๊ฒ์ด ์ค์ ๋ก nonce ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ๋ฌธ์ ์ ์ด๋ฆ/๋ ์ด๋ธ๋ง ๋ณ๊ฒฝํ๋ฉด์ ๋์์ ๋ฌธ์ ๋ฅผ ์๋๋ณด๋ค ๋ ๋ณต์กํ๊ฒ ๋ง๋ค์์ต๋๋ค.
์
์งธ, iv
๋ณดํธ์ ๋ํ ์ ์ฑ
์ ์์ํ๊ณ ์์ผ๋ฏ๋ก ์ฃผ์ ๋ณดํธ ์ ์ฑ
์๋ ์ฐธ์ฌํด์ผ ํฉ๋๊น? ํค ๋ฐฐํฌ ์ ์ฑ
์ ์ด๋ป์ต๋๊น? ๊ทธ๊ฒ๋ค์ ๋ถ๋ช
ํ ๋ ๋์ ์์ค์ ์ฐ๋ ค์
๋๋ค.
๋ง์ง๋ง์ผ๋ก nonce๋ ์์ ๊ณ์ธต์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋งค์ฐ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ณ์ธต ๊ฐ ๋ฌธ์ ๊ฐ ํจ๊ป ๊ฒฐํฉ๋๋ ์ทจ์ฝํ ์ํคํ ์ฒ๋ฅผ ์ํ์ง ์์ต๋๋ค.
์์งํ ๋งํด์ ๋๊ตฐ๊ฐ๊ฐ ๋ด๊ฐ ๋ฌด์์ ํ๋์ง ์๋ค๊ณ ์ ์ค์ฒ๋ฅผ ์ทจํ์ง ์๋ ํ ๊ธฐ๋ณธ ์์๋ฅผ ์จ๊ธธ ์ ์๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ํ ์ ์์ต๋๋ค. ์ฌ๋๋ค์ด "์ค, ์ด๊ฒ์ด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ฉํ๊ฒ ์ต๋๋ค"๋ผ๊ณ ๋งํ์ง๋ง ์๋ชป๋ ์ํธ ๊ตฌํ์ด ๋๋ฌด ๋ง์ต๋๋ค. ์ ์ฅ AES ์์ฒด๋ฅผ ๋ณด์ธ์. HMAC ์์ด ๊ทธ๋ฅ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
API๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ทธ๊ฒ ์กฐ๊ธ ๋ ๊ณ ํต์ค๋ฝ๋ค๋ฉด ์์งํ ์ ๋ ์ฐฌ์ฑํฉ๋๋ค. 99%์ ๊ฐ๋ฐ์๋ ์ํธํ์ ๊ด๋ จํ์ฌ ์์ ์ด ๋ฌด์์ ํ๊ณ ์๋์ง ๋ชจ๋ฅด๊ณ ์์ผ๋ฉฐ 1%์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฅผ ์ฝ๊ฒ ์ํํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ฐ์ ์์๊ฐ ๋ฎ์์ผ ํฉ๋๋ค.
์คํฌ์ด ์กด์ฌํ์ง ์์ต๋๋ค. ๋๋ ๋ฌด์์ด ์ฌ์ง ๋ชจ๋ฅด๋ ์ ๊ฒฝ์ฐ์ง ์๋๋ค - ๊ทธ๊ฒ์ NetStandard2์ ์๋ค
@Drawaes ๊ฐ ์ง์ ํ @sdrapkin Span<T>
๋ .NET Standard 1.0 ์ด๋ฏ๋ก ๋ชจ๋ ํ๋ ์์ํฌ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ์ฐธ์กฐ๋ ์ค์ ์ฐฝ์๋ง ์ก์ธ์คํ ์ ์์ผ๋ฏ๋ก ArraySegment<T>
๋ณด๋ค ์์ ํฉ๋๋ค. ์ ์ฒด ๋ฐฐ์ด๋ณด๋ค.
๋ํ ReadOnlySpan<T>
๋ ํด๋น ์ฐฝ์ ๋ํ ์์ ์ ๋ฐฉ์งํฉ๋๋ค. ์ ๋ฌ๋ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ์์ ๋ฐ/๋๋ ์ ์งํ ์ ์๋ ๋ฐฐ์ด ์ธ๊ทธ๋จผํธ์ ๋ฌ๋ฆฌ ์ ๋ฌ๋ฉ๋๋ค.
Span์ sync apis์ ์ผ๋ฐ์ ์ธ ์ด๋ ๊ฒฝ๋ก์ฌ์ผ ํฉ๋๋ค(Span์ ์ฌ์ฉํ๋ api๋ stackalloc'd, ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋ฐฐ์ด์ ์ถ๊ฐ๋ก ๋์ฒํ ์ ์๋ค๋ ์ฌ์ค์ ์ฅ์์ ๋๋ค)
์ฆ
ArraySegment๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์๋ฅผ ํตํด ์ฝ๊ธฐ ์ ์ฉ์ด ์ ์๋ฉ๋๋ค. ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ฝ๊ธฐ/์์ ์ด ๋ฐฉ์ง๋์ง ์์ต๋๋ค.
void Encrypt(
ArraySegment<byte> iv, // readonly; covered by authentication
ArraySegment<byte> plaintext, // readonly; covered by authentication
ref ArraySegment<byte> ciphertext, // must be of at least [plaintext_length + MaxTagSize] length. iv is not part of ciphertext.
ArraySegment<byte> additionalData = default(ArraySegment<byte>) // readonly; optional; covered by authentication
);
๊ทธ๋ฌ๋ Span์์๋ ์ฝ๊ธฐ ์ ์ฉ์ด api์ ์ํด ์ํ๋ฉ๋๋ค. ๋ฟ๋ง ์๋๋ผ ๋ฐฉ์ง๋๋ ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ฝ๊ธฐ
void Encrypt(
ReadOnlySpan<byte> iv, // covered by authentication
ReadOnlySpan<byte> plaintext, // covered by authentication
Span<byte> ciphertext, // must be of at least [plaintext_length + MaxTagSize] length. iv is not part of ciphertext.
ReadOnlySpan<byte> additionalData = ReadOnlySpan<byte>.Empty) // optional; covered by authentication
);
๋งค๊ฐ๋ณ์๋ก ์๋๋ฅผ ํจ์ฌ ๋ ์ ์ ๋ฌํฉ๋๋ค. ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ฝ๊ธฐ/์ฐ๊ธฐ์ ๊ด๋ จํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
@benaadams @Drawaes ๋ Span<T>
๊ฐ NetStandard์ ์๋ค๊ณ ๋งํ ์ ์ด ์์ต๋๋ค( ์ถ์๋ NetStandard ). ๊ทธ๊ฐ ๋งํ ๊ฒ์ (1) Span<T>
๊ฐ ๋ฐฐ์ก๋ NetStandard์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. (2) Span<T>
๋ _"2.1 ๊ธฐ๊ฐ ๋ด์ ๋ฐฐ์ก"_๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด ํน์ Github ๋ฌธ์ ์ ๊ฒฝ์ฐ (์ฝ๊ธฐ ์ ์ฉ) Span<T>
๋
ผ์๋ ํ์ฌ ์ค๋จ ๋๊ณ ์์ต๋๋ค. ์ค๊ณํ API์ ๋ฒ์๋ ๋ชฉ์ ์ ๋ํ ๋ช
ํ์ฑ์ ์์ต๋๋ค.
์์ ์ ์์ค ์์ AEAD API(์: CAESAR์ ์ ์ฌ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋๋ ๋์ ์์ค์ ์ค์ฉ ๋ถ๊ฐ๋ฅ ๋๋ ๋ด์ฑ AEAD API๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋๋ฉด ๋ ๋ค ํฉ๋๋ค. ๋๋ ๋ถ์ ๋ง๋น ์ํ๊ฐ ๋์ด ์ง๊ธ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์๋ ์์ต๋๋ค.
ํต์ฌ ์ธ์ด์ ์ผ๋ถ์ธ ์ํธํ์๋ ๊ฒฌ๊ณ ํ๊ณ ๋ฎ์ ์์ค์ ๊ธฐ๋ณธ API๊ฐ ์์ด์ผ ํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ์๊ฐํฉ๋๋ค. ์ผ๋จ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํต์ฌ ๋๋ ์ปค๋ฎค๋ํฐ์์ ์์ ์์ค API ๋๋ "ํ์ต ๋ฐํด" API๋ฅผ ๋ง๋๋ ๊ฒ์ ๋น ๋ฅด๊ฒ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋๊ตฌ์๊ฒ๋ ์ฐ์ํ๊ฒ ๊ทธ ๋ฐ๋๋ก ๋์ ํ๋ค. ๋ํ ์ฃผ์ ๋ " ์ํธํ์ ๋ํ ์ผ๋ฐ ์ ์์ค ๊ธฐ๋ณธ "์ ๋๋ค!
@Drawaes ์ด๊ฒ์ ์๋ ดํ๊ณ ํด๊ฒฐํ ํ์ ๋ผ์ธ์ด ์์ต๋๊น? ๊ทธ๋ฌํ GitHub ๊ฒฝ๊ณ ์ธ์ Microsoft ์ด์ธ์ ์ฌ๋๋ค์ ํฌํจ์ํฌ ๊ณํ์ด ์์ต๋๊น? 30๋ถ ํ์ ํตํ๋ฅผ ์ข์ํ์๋์? ๋๋ ํ ๋ผ ๊ตฌ๋ฉ์์ ๋ฒ์ด๋๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ง๋ง .NET ํต์ฌ ์ํธํ๊ฐ ํน์ ์์ค์ ์ฑ์๋์ ์์ ์ฑ์ ์์ ๊ฒ์ด๋ผ๊ณ ์ฅ๋ดํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๋ฌํ ๋ ผ์๋ฅผ ๋ถ๋ฅํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ ํ ์ด ๋ฌธ์ ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Microsoft Cryptography Board(Microsoft์ ์ํธํ ์ฌ์ฉ์ ์กฐ์ธํ๋ ์ฐ๊ตฌ์ ๋ฐ ๊ธฐํ ์ ๋ฌธ๊ฐ ์งํฉ)๋ฅผ ๋ง๋ฌ์ผ๋ฉฐ @bartonjs ์์ ๊ณง ๊ณต์ ํ ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ฝ๊ฐ์ ๋ฐ์ดํฐ ํ๋ฆ ๋์์ Crypto Board์ ์กฐ์ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์์ ์๊ฐํด ๋์ต๋๋ค. ์ฐ๋ฆฌ ๋ชจ๋ธ์ GCM, CCM, SIV ๋ฐ CBC+HMAC์์ต๋๋ค(์ง๊ธ SIV ๋๋ CBC+HMAC๋ฅผ ์ํํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ์์ ์ฆ๋ช ํ๊ณ ์ถ์์ ๋ฟ์ ๋๋ค).
```C#
๊ณต๊ฐ ์ธํฐํ์ด์ค INonceProvider
{
์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
}
๊ณต๊ฐ ์ถ์ ํด๋์ค AuthenticatedEncryptor : IDisposable
{
๊ณต๊ฐ int NonceOrIVSizeInBits { ๊ฐ์ ธ์ค๊ธฐ; }
๊ณต๊ฐ int TagSizeInBits { ๊ฐ์ ธ์ค๊ธฐ; }
๊ณต๊ฐ ๋ถ์ธ SupportsAssociatedData { ๊ฐ์ ธ์ค๊ธฐ; }
๊ณต๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
๊ณต๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
protected AuthenticatedEncryptor(
int tagSizeInBits,
bool supportsAssociatedData,
int nonceOrIVSizeInBits) => throw null;
protected abstract bool TryEncrypt(
ReadOnlySpan<byte> data,
ReadOnlySpan<byte> associatedData,
Span<byte> encryptedData,
out int bytesWritten,
Span<byte> tag,
Span<byte> nonceOrIVUsed);
public abstract void GetEncryptedSizeRange(
int dataLength,
out int minEncryptedLength,
out int maxEncryptedLength);
public bool TryEncrypt(
ReadOnlySpan<byte> data,
ReadOnlySpan<byte> associatedData,
Span<byte> encryptedData,
out int bytesWritten) => throw null;
public byte[] Encrypt(
ReadOnlySpan<byte> data,
ReadOnlySpan<byte> associatedData) => throw null;
// some variant of the Dispose pattern here.
}
๊ณต๊ฐ ๋ด์ธ ํด๋์ค AesGcmEncryptor : AuthenticatedEncryptor
{
๊ณต๊ฐ AesGcmEncryptor(ReadOnlySpan
: ๊ธฐ๋ณธ(128, ์ฐธ, 96)
{
}
}
๊ณต๊ฐ ๋ด์ธ ํด๋์ค AesCcmEncryptor : AuthenticatedEncryptor
{
๊ณต๊ฐ AesCcmEncryptor(
์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
์ ์ nonceSizeInBits,
INonceProvider nonceProvider,
int tagSizeInBits)
: ๊ธฐ๋ณธ(tagSizeInBits, true, nonceSizeInBits)
{
์๊ณ ๋ฆฌ์ฆ ์ฌ์์ ๋ํด nonceSize ๋ฐ tagSize๋ฅผ ํ์ธํฉ๋๋ค.
}
}
๊ณต๊ฐ ์ถ์ ํด๋์ค AuthenticatedDecryptor : IDisposable
{
๊ณต๊ฐ ์ถ์ bool TryDecrypt(
์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
์ฝ๊ธฐ ์ ์ฉ ๋ฒ์
๊ธฐ๊ฐ
out int bytesWritten);
public abstract void GetEncryptedSizeRange(
int encryptedDataLength,
out int minDecryptedLength,
out int maxDecryptedLength);
public byte[] Decrypt(
ReadOnlySpan<byte> tag,
ReadOnlySpan<byte> nonceOrIV,
ReadOnlySpan<byte> encryptedData,
ReadOnlySpan<byte> associatedData) => throw null;
// some variant of the Dispose pattern here.
}
๊ณต๊ฐ ๋ด์ธ ํด๋์ค AesGcmDecryptor : AuthenticatedDecryptor
{
๊ณต๊ฐ AesGcmDecryptor(ReadOnlySpan
}
๊ณต๊ฐ ๋ด์ธ ํด๋์ค AesCcmDecryptor : AuthenticatedDecryptor
{
๊ณต๊ฐ AesCcmDecryptor(ReadOnlySpan
}
```
์ด ์ ์์ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ ๊ฑฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ์ ์์ ์ ์ฐ์ฑ์ด ๋ณ๋ก ์์ต๋๋ค. ๊ด๋ จ ์ํ(GCM์ ๊ฒฝ์ฐ ๋งค์ฐ ๋์) ๋๋ ๋ถ๊ฐ๋ฅ(CCM)๊ณผ ๊ฒฐํฉ๋ ์ค์ ์๊ตฌ ์ฌํญ(๋ฎ์)์ ์ด์ ๋ง ์ฌ๋ผ์ก์์ ์๋ฏธํฉ๋๋ค.
์ด ์ ์์ ์ํธํ๋ฅผ ์ํด ์ธ๋ถํ๋ nonce ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค์ ๊ณต๊ฐ ๊ตฌํ์ ์์ต๋๋ค. ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ /ํ๋กํ ์ฝ์ ์ปจํ ์คํธ์ ํค๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ ์ ํ๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋๋ก ์์ฒด์ ์ผ๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค. TryEncrypt์ ๋ํ ๊ฐ ํธ์ถ์ GetNextNonce์ ๋ํ ํ ๋ฒ๋ง ํธ์ถํ์ง๋ง ํน์ TryEncrypt๊ฐ ์ฑ๊ณตํ๋ค๋ ๋ณด์ฅ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด nonce๋ฅผ ๋ค์ ์๋ํด์ผ ํ๋ค๋ ์๋ฏธ์ธ์ง ์ดํดํ๋ ๊ฒ์ ์ฌ์ ํ โโ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฌ๋ ค ์์ต๋๋ค. CBC+HMAC์ ๊ฒฝ์ฐ ์ฉ์ด๋ฅผ ํผ๋ํ์ง ์๋๋ก IIVProvider๋ผ๋ ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค. SIV์ ๊ฒฝ์ฐ IV๊ฐ ๊ตฌ์ฑ๋๋ฏ๋ก ํ์ฉ๋๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์์ ๋ฐ๋ผ nonce(์ฌ์ฉ๋ ๊ฒฝ์ฐ)๋ relatedData์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ SIV๋ ์ต์ํ nonceOrIV๋ฅผ TryEncrypt์ ๋ํ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค๊ณ ์ ์ํฉ๋๋ค.
TryDecrypt๋ ๊ฐ์ฅ ํ์คํ๊ฒ ์๋ชป๋ ํ๊ทธ๋ฅผ ๋ฐ์์ํต๋๋ค. ๋์์ด ๋๋ฌด ์์ ๊ฒฝ์ฐ์๋ง false๋ฅผ ๋ฐํํฉ๋๋ค(Try-method์ ๊ท์น์ ๋ฐ๋ผ).
ํผ๋๋ฐฑ์ ์ํด ํ์คํ ์ด๋ ค ์๋ ๊ฒ๋ค:
associatedData
๋ฅผ ๊ธฐ๋ณธ๊ฐ ReadOnlySpan<byte>.Empty
์ผ๋ก ๋๊น์ง ์ด๋ํด์ผ ํฉ๋๊น?byte[]
-returning ๋ฉ์๋์ ๋ํ ์ฌ๋์ด๋ ์ฆ์ค๋ฅผ ์ฃผ์ฅํ๊ณ ์ถ์ ์ฌ๋์ด ์์ต๋๊น? (๋ฎ์ ํ ๋น์ Span ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ง ํธ์๋ฅผ ์ํ ๊ฒ์
๋๋ค)byte[]
-returning ๋ฉ์๋๋ ์ต๋ ๋ฒํผ๋ฅผ ํ ๋นํ ๋ค์ ํ์์ ๋ฐ๋ผ Array.Resizeํฉ๋๋ค.min=max=input.Length
์ ๊ฒฝ์ฐ CBC+HMAC ๋๋ SIV์๋ ํด๋น๋์ง ์์ต๋๋ค.ํ์คํ ๋ฐ์ดํธ - ๋นํธ๊ฐ ์๋๋๋ค.
ํค๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ Nonce ๊ณต๊ธ์๋ ํฐ ์ค์์
๋๋ค.
ํค๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ Nonce ๊ณต๊ธ์๋ ํฐ ์ค์์ ๋๋ค.
nonce ๊ณต๊ธ์๋ฅผ ์ํ๋ ๋๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ฌด๊ฒ๋ ์ ๊ณตํ์ง ์์ต๋๋ค.
๊ฒฐ์ ์ ์ ๋ฆฌ/ IDisposable
๋ ์ด๋ป์ต๋๊น?
๊ฒฐ์ ์ ์ ๋ฆฌ/IDisposable์ ์ด๋ป์ต๋๊น?
์ข์ ์ ํ์ ๋๋ค. AuthenticatedEncryptor/AuthenticatedDecryptor์ ์ถ๊ฐํ์ต๋๋ค. ๋๋ ๋ ผ์ค ๊ณต๊ธ์์ ๋ํ ํ๊ธฐ ๊ฐ๋ฅ์ฑ์ ์กฐ์ฌํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํธ์ถ์๋ using ๋ฌธ์ ์คํํ ์ ์์ต๋๋ค.
INonceProvider
๊ฐ๋
/๋ชฉ์ ์ด ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค(๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋ฐํฅ์ ์ค). ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ก ๋ก๋๋ค. ํค๋ฅผ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก nonce๋ฅผ ์ ๋ฌํฉ๋๋ค(์: ๋ฐ์ดํธ๋ก - ์ ์ธ๋ ๋๋ก). AE/AEAD ์ฌ์์ nonce๊ฐ ์์ฑ/์ ๋๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ ๋์ ๊ณ์ธต์ ์ฑ
์์
๋๋ค(์ ์ด๋ let-primitives-be-primitive ๋ชจ๋ธ์์๋).
์คํธ๋ฆฌ๋ฐ์ด ์๋๋์? ์ง์ง? ํต์ฌ ๊ธฐ์ด ์์ค์์ AES-GCM๊ณผ ๊ฐ์ ์คํธ๋ฆผ ์ํธ์์ ์คํธ๋ฆฌ๋ฐ์ ๊ฐ์ ๋ก ์ ๊ฑฐํ๋ ๊ทผ๊ฑฐ๋ ๋ฌด์์ ๋๊น?
์๋ฅผ ๋ค์ด, ๊ทํ์ ์ํธํํ ์์ํ๋ ์ฐ๋ฆฌ๊ฐ ๊ฒํ ํ ์ด ๋ ๊ฐ์ง ์ต๊ทผ ์๋๋ฆฌ์ค๋ฅผ ๋ฌด์์ ๊ถ์ฅํฉ๋๊น?
ํด๋ผ์ด์ธํธ์๋ 10-30GB ์ฌ์ด์ ๋์ฉ๋ ์๋ฃ ํ์ผ์ด ์์ต๋๋ค. ์ฝ์ด๋ ๋ ์์คํ ์ฌ์ด์ ๋ฐ์ดํฐ ์คํธ๋ฆผ๋ง ๋ณผ ์ ์์ผ๋ฏ๋ก ํ๋์ ํจ์ค ์คํธ๋ฆผ์ ๋๋ค. ๋ถ๋ช ํ ๊ฐ 10GB ํ์ผ์ ๋ํด ์ ํค๊ฐ ๋ฐ๊ธ๋์ง๋ง ์ด๋ฌํ ๋ชจ๋ ์ํฌํ๋ก๋ฅผ ์ธ๋ชจ์๊ฒ ๋ง๋ค์์ต๋๋ค. ์ด์ a) ๋ฐ์ดํฐ ๋ฒํผ๋ง(๋ฉ๋ชจ๋ฆฌ, ํ์ดํ๋ผ์ธ ์์) b) ์ํธํ ์ํ(ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ์์คํ ์ ์ด์ ์ ํด ์ํ์ ๋๋ค!) c) ๋ฐ์ดํฐ ์ฐ๊ธฐ(๋ฐ b ๋ค์์ ์์ฑ๋ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ๋ 100%์) ์๋ฃ) ? ๋๋ด์ด๋ผ๊ณ ๋งํด์ฃผ์ธ์. ์ฌ๋ฌ๋ถ์ ๊ณ ์๋ก "์ํธํ๋ ๋ถ๋ด์ ๋๋ค"๋ฅผ ๊ฒ์์ ๋ค์ ์ง์ด๋ฃ๊ณ ์์ต๋๋ค.
๋ฌผ๋ฆฌ์ ๋ณด์ ์ฅ์น์๋ ๋ฏธ์ฌ์ฉ ์๋๋ฆฌ์ค์์๋ ์ํธํ๋๋ ์ฌ๋ฌ 4K ์คํธ๋ฆผ์ด ์์ต๋๋ค. ์๋ก์ด ํค ๋ฐ๊ธ์ 15GB ๊ฒฝ๊ณ์์ ๋ฐ์ํฉ๋๋ค. ์ ์ฒด ํด๋ฆฝ์ ๋ฒํผ๋งํ ๊ฒ์ ์ ์ํฉ๋๊น?
์ปค๋ฎค๋ํฐ์์ ์ค์ ๋ก ์ค์ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๊ณ ์คํธ๋ฆฌ๋ฐ ์ง์์ ์ ๊ฑฐํ๋๋ก ์์ฒญํ๋ ์ฌ๋๋ค์ ์๊ฒฌ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ ์ปค๋ฎค๋ํฐ ๋ํ ์์์์ ์ฌ๋ผ์ง๊ณ ๋ด๋ถ์ ์ผ๋ก ๋ชจ์ฌ ์๋ค๊ฐ ์๋ฌด๋ ์์ฒญํ์ง ์์ ๊ฒ์ผ๋ก ๋์์์ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๊ณ "์ํธํ๋ ๋๋ฆฌ๊ณ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๊ฑด๋๋ฐ์๊ฒ ์ต๋๊น?"๋ผ๊ณ ๋ค์ ๊ฐ์กฐํฉ๋๋ค.
์ ์ฒด ์ํ๊ณ์ ๋ํ ๊ฒฐ์ ์ ๋ถ๊ณผํ๋ ๋์ ๋ ์ต์
์ ๋ชจ๋ ์ง์ํ๋ Encrypt
๋ฐ EncryptFinal
๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฐ์ํ ๋์์ธ์ ํต์ ๊ฐ ์๋ ๋ณต์ก์ฑ์ ์ ๊ฑฐํฉ๋๋ค.
ํต์ฌ ๊ธฐ์ด ์์ค์์ AES-GCM๊ณผ ๊ฐ์ ์คํธ๋ฆผ ์ํธ์์ ์คํธ๋ฆฌ๋ฐ์ ๊ฐ์ ๋ก ์ ๊ฑฐํ๋ ๊ทผ๊ฑฐ๋ ๋ฌด์์ ๋๊น?
๋๋ ๊ทธ๊ฒ์ด ๋ค์๊ณผ ๊ฐ์๋ค๊ณ ์๊ฐํ๋ค.
์ด ์ ์์ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ ๊ฑฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ์ ์์ ์ ์ฐ์ฑ์ด ๋ณ๋ก ์์ต๋๋ค. ๊ด๋ จ ์ํ(GCM์ ๊ฒฝ์ฐ ๋งค์ฐ ๋์) ๋๋ ๋ถ๊ฐ๋ฅ(CCM)๊ณผ ๊ฒฐํฉ๋ ์ค์ ์๊ตฌ ์ฌํญ(๋ฎ์)์ ์ด์ ๋ง ์ฌ๋ผ์ก์์ ์๋ฏธํฉ๋๋ค.
GCM์๋ ํค ๋ณต๊ตฌ๋ฅผ ํ์ฉํ๋ ์ฃ์ก์ค๋ฌ์ด ์๊ฐ์ด ๋๋ฌด ๋ง์ต๋๋ค. ๊ณต๊ฒฉ์๊ฐ ์ ํํ ์ํธ๋ฌธ์ ์ํํ๊ณ ํ๊ทธ ํ์ธ ์ด์ ์ ์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ์ ๋ณผ ์ ์์ผ๋ฉด ํค๋ฅผ ๋ณต๊ตฌํ ์ ์์ต๋๋ค. (๋๋ ์ํธ ๋ถ์๊ฐ ์ค ํ ๋ช ์ด ๋์๊ฒ ๋งํฉ๋๋ค). ์ฌ์ค์ GCM ์ฒ๋ฆฌ ๋ฐ์ดํฐ๊ฐ ํ๊ทธ ํ์ธ ์ ์ด๋ ์์ ์์๋ ๊ด์ฐฐ ๊ฐ๋ฅํ๋ฉด ํค๊ฐ ์์๋ฉ๋๋ค.
Crypto Board๋ ์ฒซ ๋ฒ์งธ ์๋๋ฆฌ์ค์ GCM์ ์ฌ์ฉํ์ง ์๊ณ CBC+HMAC๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ ๋ฒ์งธ ์๋๋ฆฌ์ค๊ฐ 4k ํ๋ ์์ด๊ณ ๊ฐ 4k ํ๋ ์์ ์ํธํํ๋ ๊ฒฝ์ฐ ์ด ๋ชจ๋ธ์์ ์๋ํฉ๋๋ค. ๊ฐ 4k + nonce + ํ๊ทธ ํ๋ ์์ ๋ฐ์ดํธ๋ฅผ ๋ค์ ๋ฐ๊ธฐ ์ ์ ํด๋ ๋๊ณ ํ์ธ๋๋ฏ๋ก ํค ์คํธ๋ฆผ/ํค๊ฐ ๋์ถ๋์ง ์์ต๋๋ค.
๋น๊ต๋ฅผ ์ํด: ์ ๋ ํ์ฌ ์ด "ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ก ์ค์ " ์ํธํ API๋ฅผ ๊ฐ๋ฐ ์ค์ ๋๋ค. ๋ค์ ์ ์ธ์ฆ๋ ์ํธํ์ ๋ํ ํด๋์ค์ ๋๋ค.
๋์๊ฒ๋ ํค์ ๋ ๋ฆฝ์ ์ผ๋ก ์ํธํ ๊ธฐ๋ณธ ์์์ ๋ํด ์ด์ผ๊ธฐํ ์ ์๋ค๋ ๊ฒ์ด ์ ์ฉํ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํน์ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๋ชจ๋ AEAD ์๊ณ ๋ฆฌ์ฆ๊ณผ ํจ๊ป ์๋ํ๋ ๋ฉ์๋์ ์ฐ๊ฒฐํ๊ณ ํค ๋ฑ์ ์์ฑ์ ํด๋น ๋ฉ์๋์ ๋งก๊ธฐ๊ณ ์ถ์ต๋๋ค. ๋ฐ๋ผ์ AeadAlgorithm ํด๋์ค์ ๋ณ๋์ Key ํด๋์ค๊ฐ ์์ต๋๋ค.
์ด๋ฏธ ์ฌ๋ฌ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ๋ ๋ค๋ฅธ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ ๋ชจ๋ ๊ฒ์ ๋ํด ์ผ๋ฐ byte[]
๋๋ Span<byte>
๋ฅผ ์ฌ์ฉํ๋ ๋์ ๊ณ ์ ํ ์ ํ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ชจ์์ ๋ฐ์ดํฐ(์: Key ๋ฐ Nonce )๋ฅผ ๋ํ๋ด๋ ๊ฒ์
๋๋ค.
AeadAlgorithm API(ํ์ฅํ๋ ค๋ฉด ํด๋ฆญ)
public abstract class AeadAlgorithm : Algorithm
{
public int KeySize { get; }
public int NonceSize { get; }
public int TagSize { get; }
public byte[] Decrypt(
Key key,
Nonce nonce,
ReadOnlySpan<byte> associatedData,
ReadOnlySpan<byte> ciphertext)
public void Decrypt(
Key key,
Nonce nonce,
ReadOnlySpan<byte> associatedData,
ReadOnlySpan<byte> ciphertext,
Span<byte> plaintext)
public byte[] Encrypt(
Key key,
Nonce nonce,
ReadOnlySpan<byte> associatedData,
ReadOnlySpan<byte> plaintext)
public void Encrypt(
Key key,
Nonce nonce,
ReadOnlySpan<byte> associatedData,
ReadOnlySpan<byte> plaintext,
Span<byte> ciphertext)
public bool TryDecrypt(
Key key,
Nonce nonce,
ReadOnlySpan<byte> associatedData,
ReadOnlySpan<byte> ciphertext,
out byte[] plaintext)
public bool TryDecrypt(
Key key,
Nonce nonce,
ReadOnlySpan<byte> associatedData,
ReadOnlySpan<byte> ciphertext,
Span<byte> plaintext)
}
@bartonjs ๊ทธ/๊ทธ๋ ๊ฐ ๋ง์ต๋๋ค. ์ธ์ฆํ ๋๊น์ง ์ถ๋ ฅ๋์ง ์๋ ํ๋ก๊ทธ๋จ์ ์์กดํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ธ์ฆํ์ง ์๊ฑฐ๋ ์์ง ์ธ์ฆํ์ง ์์ ๊ฒฝ์ฐ ๋ธ๋ก์ ๋ํ ์ ๋ ฅ์ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ์ถ๋ ฅ์ ์๊ณ ๊ฑฐ๊ธฐ์์ ๊ฑฐ๊พธ๋ก ์์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด man in the middle attack์ ์๋ ค์ง ๋ธ๋ก์ cbc ์คํธ๋ฆผ์ ์ฃผ์ ํ๊ณ ๊ณ ์ ์ ์ธ ๋นํธ ๋ค์ง๊ธฐ ๊ณต๊ฒฉ์ ์ํํ ์ ์์ต๋๋ค.
์ง๋ ฌ nonce ๋๋ ์ด์ ์ ์ฌํ ... ala TLS๋ฅผ ์ฌ์ฉํ์ฌ ์ฒญํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ง์ ๋ฐ์ดํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ธ์์, ์ ๊ฐ ํ๋ ๋ง์ ๋ค์ ๋ง์๋๋ฆฌ์๋ฉด, ์ผ๋ฐ์ ์ธ ๋ชฉ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ถฉ๋ถํ์ง ์์ ์์ ํฌ๊ธฐ์ ๋คํธ์ํฌ์๋ง ํด๋น๋ฉ๋๋ค.
๊ณต๊ฐ์ ์ ์ ์ผ๋ก ๋๊ฐ Microsoft ์ํธํ ๊ฒํ ์์ํ์ ์๋์ง(์ด์์ ์ผ๋ก๋ ์ด ์ฃผ์ ๋ฅผ ๊ฒํ ํ ํน์ ๊ตฌ์ฑ์์ ์๊ฒฌ/์๊ฒฌ) ๋ฐํ ์ ์์ต๋๊น? ๋ธ๋ผ์ด์ธ ๋ผ๋งํค์ ์ ๊ทธ ์ธ ๋๊ตฌ?
_์ญ์ฌ๋ฆฌํ ์ฌ์ฉ:_
์คํธ๋ฆฌ๋ฐ AEAD๊ฐ ๋์์ ๊ธฐ์ฉ๋๋ค . ์ด๊ฒ์ Inferno ๊ฐ ๊ณ์ํด์ ํ๊ท ์ ์ธ Joe๋ฅผ ์ํ ์ ์ผํ ์ค์ฉ์ ์ธ CryptoStream
๊ธฐ๋ฐ ์คํธ๋ฆฌ๋ฐ AEAD์์ ์๋ฏธํฉ๋๋ค. MS Crypto Review Board์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
@ektrah ์ ์๊ฒฌ์ ๋ฐํ์ผ๋ก ๊ทธ์ (๊ทธ๋ ?) ์ ๊ทผ ๋ฐฉ์์ ์์ ์ธ๊ธํ RFC 5116 ์ ์ํด ์ฃผ๋๋ฉ๋๋ค. RFC 5116์๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ๋ชฉํ ๋งํ ์ธ์ฉ๋ฌธ์ด ๋ง์ด ์์ต๋๋ค.
3.1. Nonce ์์ฑ์ ๋ํ ์๊ตฌ ์ฌํญ
ํค์ ๊ณ ์ ๊ฐ์ ๋ํด ์ธ์ฆ๋ ์ํธํ ์์ ์ ๊ฐ ํธ์ถ์ ๋ํด ๊ฐ nonce ๊ฐ์ด ๊ณ ์ ํด์ผ ํ๋ค๋ ์๊ตฌ ์ฌํญ์ ์กด์คํ๋ ๋ฐฉ์์ผ๋ก nonce๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋ณด์์ ํ์์ ์ ๋๋ค.
...
- AEAD ์๊ณ ๋ฆฌ์ฆ ์ฌ์์ ๋ํ ์๊ตฌ ์ฌํญ
๊ฐ AEAD ์๊ณ ๋ฆฌ์ฆ์ N_MIN ๋ฐ N_MAX ๊ฐ์ด ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ์ ํ N_MIN ๋ฐ N_MAX ์ฅํ (ํฌํจ) ์ฌ์ด์ ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋ชจ๋ nonce๋ฅผ ์๋ฝํด์ผ ํฉ๋๋ค. N_MAX์ N_MIN์ ๊ฐ์ ๊ฐ์ ์ ์์ต๋๋ค. ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ธธ์ด๊ฐ 12์ฅํ ์ธ ๋ ผ์ค๋ฅผ ๋ฐ์๋ค์ฌ์ผ ํฉ๋๋ค(SHOULD). ์๋์ ์ค๋ช ๋ ๋ฌด์์ ๋๋ ์ํ ์ ์ฅ ์๊ณ ๋ฆฌ์ฆ์ N_MAX ๊ฐ์ด 0์ผ ์ ์์ต๋๋ค(MAY).
...
์ธ์ฆ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฅผ ๋ค์ด ์ํธ๋ฌธ ์ถ๋ ฅ์ ํตํฉ๋๋ ๋ด๋ถ ์ด๊ธฐํ ๋ฒกํฐ ์์ฑ์ ์ํด ์์ ์์ค๋ฅผ ํตํฉํ๊ฑฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค(MAY). ์ด๋ฌํ ์ข ๋ฅ์ AEAD ์๊ณ ๋ฆฌ์ฆ์ randomized๋ผ๊ณ ํฉ๋๋ค. ์ํธํ๋ง ๋ฌด์์์ด๋ฉฐ ์ํธ ํด๋ ์ ํญ์ ๊ฒฐ์ ์ ์ ๋๋ค. ๋ฌด์์ ์๊ณ ๋ฆฌ์ฆ์ 0๊ณผ ๊ฐ์ N_MAX ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค(MAY).
์ธ์ฆ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฅผ ๋ค์ด ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๋ด๋ถ ์์๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ ๊ณ ์ ํ ๊ฐ์ ๊ตฌ์ฑ์ ํ์ฉํ๊ธฐ ์ํด ์ํธํ ์์ ์ ํธ์ถ ์ฌ์ด์ ์ ์ง๋๋ ๋ด๋ถ ์ํ ์ ๋ณด๋ฅผ ํตํฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ข ๋ฅ์ AEAD ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์ ์ฅ(stateful)์ด๋ผ๊ณ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๊ธธ์ด๊ฐ 0์ธ nonce๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ์๋ ์ฐ์ํ ๋ณด์์ ์ ๊ณตํ๊ธฐ ์ํด ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ํ ์ ์ฅ ์๊ณ ๋ฆฌ์ฆ์ 0๊ณผ ๊ฐ์ N_MAX ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค(MAY).
ํ์ํ ๊ฐ์น๊ฐ ์๋ ํ ๊ฐ์ง ์์ด๋์ด๋ ๊ธธ์ด๊ฐ 0์ด๊ฑฐ๋ null์ธ Nonce๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ธฐ๋ณธ๊ฐ์ผ ์๋ ์์ต๋๋ค. ์ด๋ฌํ "ํน๋ณํ" Nonce ๊ฐ์ ์ ๋ฌํ๋ฉด ์ค์ Nonce ๊ฐ์ด ๋ฌด์์๋ก ์ง์ ๋๋ฉฐ Encrypt์ ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
"์ด์ " ๋๋ฌธ์ INonceProvider
๊ฐ ์ ์ง๋๋ ๊ฒฝ์ฐ AuthenticatedEncryptor
๋ฅผ ๋ค์ ์
๋ ฅํ ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ๋๋ Reset()
ํธ์ถ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐ๋ฉด์ AuthenticatedEncryptor
์ธ์คํด์ค์ ํค๋ฅผ ๋ค์ ์
๋ ฅํ์ง ์์ ๊ณํ์ด๋ผ๋ฉด ์คํธ๋ฆฌ๋ฐ ์ฒญํฌ ์ํธํ API(์: ์ฒญํฌ = ๋คํธ์ํฌ ํจํท)๋ฅผ ๊ตฌ์ถํ๋ ค๋ ๊ฒฝ์ฐ GC๋ฅผ ํ๊ธฐํ๊ณ ๋ชจ๋ ์ฒญํฌ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค. ๋ค๋ฅธ ํค๋ก ์ํธํ๋จ(์: Netflix MSL ํ๋กํ ์ฝ, Inferno ๋ฑ). ํนํ AEAD ์์ง ํ์ ์ ์ง ๊ด๋ฆฌํ๊ณ enc/dec๋ฅผ ์ํํ๊ธฐ ์ํด ํด๋น ํ์์ ์ธ์คํด์ค๋ฅผ ์ฐจ์ฉํ๋ ค๋ ๋ณ๋ ฌ enc/dec ์์
์ ๊ฒฝ์ฐ. GC์๊ฒ ์ฌ๋์ ์ฃผ์ธ์ :)
๋ด ๊ด์ ์์ ์ํธํ ๊ธฐ๋ณธ ์์์ ์ ์ผํ ๋ชฉ์ ์ ์ ์ค๊ณ๋ ๊ณ ๊ธ ๋ณด์ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ํ๋กํ ์ฝ์ ๊ณ ์ ํ ๋ฐฉ์์ผ๋ก ์์ ํญ๋ชฉ์ ์์ฑํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
GCM์ ์ผ๋ฐ์ ์ธ nonce ํฌ๊ธฐ(96๋นํธ)์์ ์์ nonce์ ๋ํด ๋๋ฌด ์ทจ์ฝํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ๋ฌด์์ nonce๋ฅผ ์ง์ํ๋ ๋ณด์ ํ๋กํ ์ฝ์ ์์ง ๋ชปํฉ๋๋ค.
์ํธํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ ๊ณตํ๋ ๋ ๋ง์ API์ ๋ํ ์์๋ ๋ง์ง ์์ต๋๋ค. 99.9%์ ๊ฐ๋ฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์ ์ฅ, ์ ์ฅ ํ์ผ ์ํธํ, ์ํํธ์จ์ด ์ ๋ฐ์ดํธ๋ฅผ ์์ ํ๊ฒ ์ ์กํ๋ ๋ฑ ๋ณด์ ๊ด๋ จ ์๋๋ฆฌ์ค๋ฅผ ์ํ ๊ณ ๊ธ ๋ ์ํผ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ณ ๊ธ ๋ ์ํผ๋ฅผ ์ํ API๋ ๋๋ญ ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์ผํ API๋ ์ข ์ข HTTPS์ ์ํธํ ๊ธฐ๋ณธ ์์๋ฟ์ด๋ฏ๋ก ๊ฐ๋ฐ์๋ ์์ฒด ๋ณด์ ํ๋กํ ์ฝ์ ์คํํด์ผ ํฉ๋๋ค. IMO ์๋ฃจ์ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ ์์ ์ ์ํ API ์ค๊ณ์ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด์ง ์๋ ๊ฒ์ ๋๋ค. ๊ณ ๊ธ ๋ ์ํผ์ฉ API์ ๋๋ค.
ํผ๋๋ฐฑ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฌ๋ฌ๋ถ! ๋ช ๊ฐ์ง ์ง๋ฌธ:
1 . = ์ฌ์ฉ์์๊ฒ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ํ์ง ์๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ ๋๊ตฐ๊ฐ๊ฐ 10GB ํ์ผ๋ก ์๋๋ฆฌ์ค๋ฅผ ์์ํด๋ณด์ญ์์ค. ๊ทธ๋ค์ ์คํธ๋ฆฌ๋ฐ์ ๋ฐ๊ณ ์๋ค๊ณ ์๊ฐํ๊ณ ๋์ค์ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ํธ๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ค์ ์ฝ๋๋ ๊ฐ์ ๋ฐํํ๊ธฐ ์ ์ 10GB๋ฅผ ๋ฒํผ๋ง(๋๋ ์๋)ํฉ๋๋ค.
@bartonjs : ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ๊ฐ ์๋ ๋น๊ณต๊ฐ ๊ฒฐ์ ์ด ํจ๊ณผ์ ์ธ ์ ๋นํ๋ผ๋ฉด ํ๋ฃจ ์ข ์ผ ๋ ผ์์ ๋ฒ์ผ ์ ์์ง๋ง ์ฃผ์ ์์ ๋ฒ์ด๋๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ฒ๋ค๊ฐ ๋ ํ๋ถํ ๋๋ฉด์ด๋ ์ค์๊ฐ ํต์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ ๊ทธ๊ณณ์์ ๋๊ตฌ๋ฅผ ํ๋๊ฒ ํ๊ณ ์ถ์ง ์์ต๋๋ค.
ํนํ ์คํฐ๋ฐ => ํ๊ทธ ํ์ธ ์ ์ ๋ณตํธํ๋ ๋ฐ์ดํฐ๋ฅผ ํธ์ถ์์๊ฒ ๋ฐํ => ๋ณด์ ์์. ์ด๊ฒ์ ์๋ฆฌ๊ฐ ์๋๋๋ค. @bartonjs ๋ '์ ํ๋ ์ํธ๋ฌธ => ์ถ๋ ฅ ๋ณด๊ธฐ => ํค ๋ณต๊ตฌ'๋ฅผ ์ฃผ์ฅํ๋ ๋ฐ๋ฉด @drawaes ๋ '๋ธ๋ก์ ๋ํ ์ ์ด ์ ๋ ฅ => ๋ฐ๋ผ์ ์ถ๋ ฅ์ ์๊ณ ์์ => "๊ฑฐ๊ธฐ์์ ์์ "'์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค.
๊ธ์์, AES-GCM์์ ํ๊ทธ๊ฐ ํ๋ ์ผ์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ(๋ณ์กฐ ๋ฐฉ์ง) ๋ฟ์ ๋๋ค . ๊ฐ์ธ ์ ๋ณด ๋ณดํธ์ 0 ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ค์ ๋ก AES-GCM์์ GCM/GHASH ํ๊ทธ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ฉด ๋จ์ํ AES-CTR ๋ชจ๋๊ฐ ๋ฉ๋๋ค. ํ๋ผ์ด๋ฒ์ ์ธก๋ฉด์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ด ๊ตฌ์กฐ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ CTR์ ๋นํธ ํ๋ฆฝ์ ์ ์ฐํ์ง๋ง ๊ธฐ๋ณธ AES ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์์๋์์์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋ ์ฌ๋์ด ์ฃผ์ฅํ๋ ๋ฐฉ์(ํค ๋๋ ์ผ๋ฐ ํ ์คํธ ๋ณต๊ตฌ)์์ "๊นจ์ง์ง" ์์ต๋๋ค. ์ํธ ๋ถ์๊ฐ(๋๊ตฌ์ ๋๊น?)๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ชจ๋ฅด๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด ๊ทธ/๊ทธ๋ ๊ฐ ๊ทธ๊ฒ์ ๊ฒ์ํด์ผ ํฉ๋๋ค. ๊ฐ๋ฅํ ์ ์ผํ ๊ฒ์ ๊ณต๊ฒฉ๋ฐ์ ์ฌ๋์ด ๋นํธ N์ ๋ค์ง์ ์ ์๊ณ ์ผ๋ฐ ํ ์คํธ์ ๋นํธ N์ด ๋ค์งํ๋ค๋ ๊ฒ์ ์ ์ ์์ง๋ง ์ค์ ์ผ๋ฐ ํ ์คํธ๊ฐ ๋ฌด์์ธ์ง๋ ๊ฒฐ์ฝ ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์
1) ์ผ๋ฐ ํ
์คํธ ๊ฐ์ธ ์ ๋ณด๊ฐ ํญ์ ์ ์ฉ๋ฉ๋๋ค.
2) ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ์ ๋จ์ํ ์ฐ๊ธฐ๋๊ณ (์คํธ๋ฆผ์ด ๋๋ ๋๊น์ง)
3) ์ด๋ ํ ํค๋ ์์๋์ง ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ์ด ๊ธฐ๋ณธ์ธ ์ ํ ๋ฐ ์์คํ ์ ๊ฒฝ์ฐ ์ด์ AEAD์์ ์ผ๋ฐ AES ์ํธํ๋ก ์ผ์์ ์ผ๋ก ๋จ๊ณ๋ฅผ ๋ฎ์ถ๊ณ ํ๊ทธ ํ์ธ ์ ๋ค์ AEAD๋ก ๋ค์ ์ฌ๋ผ๊ฐ๋ ์ ์ถฉ์์ ์ค๊ณํ ์ ์์ต๋๋ค. ์ด๋ "์ด ๋ชจ๋ ๊ฒ์ ๋ฒํผ๋งํ๊ณ ์ถ์ต๋๊น? ๋ฏธ์ณค์ต๋๊น? ์ฐ๋ฆฌ๋ ์ํธํ๋ฅผ ํ ์ ์์ต๋๋ค!"๋ผ๊ณ ๋งํ๋ ๋์ ๋ณด์์ ์์ฉํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ์ ์ ์ธ ๊ฐ๋ ์ ์ ๊ธ ํด์ ํฉ๋๋ค.
๋ชจ๋ Encrypt
๋ฐ EncryptFinal
(๋๋ ์ด์ ์์ํ๋ ๊ฒ)๊ฐ ์๋ EncryptFinal
๊ตฌํํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด์ AES-GCM์ "์ฃ์กํ ์๊ฐ"์ ์ฆ๊ธธ ์ ์๋ ๋ง๋ฒ์ ์ง์น์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ๋จ์ํ AES-CTR + GHASH(๊ฐ๋ฅํ๋ค๋ฉด ์ผ์ข ์ ํด์)์ ๋๋ค. ๊ฐ์ธ ์ ๋ณด์ ๊ด๋ จ๋ Nonce ๊ณ ๋ ค ์ฌํญ์ CTR ๋ชจ๋์์ ์์๋๊ณ ๋ฌด๊ฒฐ์ฑ๊ณผ ๊ด๋ จ๋ ํ๊ทธ ๊ณ ๋ ค ์ฌํญ์ ์ฌ์์์ ํ์ฉ๋๋ ๊ฐ๋ณ ํ๊ทธ ํฌ๊ธฐ์์ ๋์ต๋๋ค. ์ฌ์ ํ AES-CTR + GHASH๋ ์ฒซ ๋ฒ์งธ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฐ์ธ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ ๋ฒ์งธ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฌด๊ฒฐ์ฑ์ ์ฒ๋ฆฌํ๋ค๋ ์ ์์ AES-CBC + HMAC-SHA256๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. AES-CBC + HMAC-SHA256์์ ์ํธ๋ฌธ์ ๋นํธ ํ๋ฆฝ์ ํด๋ ๋ ํ ์คํธ์ ํด๋น ๋ธ๋ก์ ์์์ํค๊ณ (CTR๊ณผ ๋ฌ๋ฆฌ) ๋ค์ ํด๋ ๋ ์ผ๋ฐ ํ ์คํธ ๋ธ๋ก(์: CTR)์ ๋นํธ๋ฅผ ๊ฒฐ์ ๋ก ์ ์ผ๋ก ๋ค์ง์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๊ณต๊ฒฉ์๋ ๊ฒฐ๊ณผ ์ผ๋ฐ ํ ์คํธ๊ฐ ๋ฌด์์ธ์ง ์ ์ ์์ต๋๋ค. ๋จ์ง ๋นํธ๊ฐ ๋ค์งํ ๊ฒ๋ฟ์ ๋๋ค(์: CTR). ๋ง์ง๋ง์ผ๋ก ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ(HMAC-SHA256)๊ฐ ์ด๋ฅผ ํฌ์ฐฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ง๋ง ๋ฐ์ดํธ๋ง ์ฒ๋ฆฌํฉ๋๋ค(์: GHASH).
๋ฐ๋ผ์ ๋ฌด๊ฒฐ์ฑ์ด ์ ์์ผ ๋๊น์ง ๋ชจ๋ ํด๋ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฅํ๋ค๋ ์ฃผ์ฅ์ด ์ง์ ์ผ๋ก ์ข์ ๊ฒ์ด๋ผ๋ฉด ์ผ๊ด๋๊ฒ ์ ์ฉํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ AES-CBC ๊ฒฝ๋ก์์ ๋์ค๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ HMAC-SHA256์ด ํต๊ณผํ ๋๊น์ง ๋ฒํผ๋ง๋์ด์ผ ํฉ๋๋ค(๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ๋ด๋ถ์ ์ผ๋ก). ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก .NET์์ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๊ฐ AEAD์ ๋ฐ์ ์ผ๋ก๋ถํฐ ํํ์ ๋ฐ์ ์ ์์์ ์๋ฏธํฉ๋๋ค. .NET์ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ก ๋ค์ด๊ทธ๋ ์ด๋ํฉ๋๋ค. ์ํธํ ์์ ๋๋ ์ผ๋ฐ ์ํธํ ์ค์์ ์ ํํฉ๋๋ค. AEAD๊ฐ ์์ต๋๋ค. ๋ฒํผ๋ง์ด ๊ธฐ์ ์ ์ผ๋ก ๋น์ค์ฉ์ ์ผ ๊ฒฝ์ฐ ๊ฑด์ถ๊ฐ๋ ์ต์ํ ์ต์ข ์ฌ์ฉ์์๊ฒ "๋ฌด๊ด์ฌ"์ด ์๋ "๋๋ก ์์์ด ์์๋ ์ ์์"์ ๊ฒฝ๊ณ ํ ์ ์๋ ์ต์ ์ด ์์ด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ๋ ์ ์ ๋ ์ปค์ง๊ณ ๋ณด์์ ๋ ๊ฐ๋ ฅํด์ ธ์ผ ํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ์ ๋์์ด๋๊ฐ ์์ฉํด์ผ ํ๋ ํ์ค์ด๊ธฐ๋ ํฉ๋๋ค. ์ ์ธ๊ณ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถํจ ์ค๊ฐ ๋ณ์กฐ๋ฅผ ๊ฐ์งํ ์ ์๋ ์ง์ ์ผ๋ก ํตํฉ๋ AEAD ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ค ๋๊น์ง ์ฐ๋ฆฌ๋ ์น๊ตฌ์ฒ๋ผ ์ํธํ + ์ธ์ฆ์ ๊ณ ์ํด์ผ ํฉ๋๋ค. ์ง์ ํ AEAD ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์ฐ๊ตฌ๋๊ณ ์์ง๋ง ์ง๊ธ์ ์ํธํ + ์ธ์ฆ์ด ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ ์ํฌ๋ก๋๋ฅผ ์ง์ํ ์ ์๋ ๋น ๋ฅด๊ณ ์ธ๊ธฐ ์๋ AEAD ์๊ณ ๋ฆฌ์ฆ์ ๊ด์ฌ์ ๊ฐ๋ ๋งํผ "AES-GCM"์๋ ๊ด์ฌ์ด ์์ต๋๋ค.
Crypto Board๋ ์ฒซ ๋ฒ์งธ ์๋๋ฆฌ์ค์ GCM์ ์ฌ์ฉํ์ง ์๊ณ CBC+HMAC๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์์ ์ธ๊ธํ ๋ชจ๋ ๊ฒ ๋๋ ์๋๋ฆฌ์ค์ ์ธ๋ถ ์ฌํญ์ ์ ์ณ๋๊ณ AES-CBC-HMAC๊ฐ ๋ฌด๋ฃ๊ฐ ์๋์ ์์ํฉ๋๋ค. AES-CBC ์ํธํ๋ ๋ณ๋ ฌํํ ์ ์๊ณ GHASH๋ PCLMULQDQ ๋ช ๋ น์ ํตํด ๊ฐ์๋ ์ ์๊ธฐ ๋๋ฌธ์ AES -GCM๋ณด๋ค ~3๋ฐฐ ๋๋ฆฝ๋๋ค . ๋ฐ๋ผ์ AES-GCM์ ์ฌ์ฉํ์ฌ 1GB/์ด์ ์๋ ๊ฒฝ์ฐ ์ด์ AES-CBC-HMAC์์ ~300MB/์ด์ ๋๋ฌํ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ค์ "Crypto๋ ์๋๋ฅผ ๋ฆ์ถ๊ณ ๊ฑด๋ ๋ฐ์ญ์์ค"๋ผ๋ ์ฌ๊ณ ๋ฐฉ์์ ์ํํฉ๋๋ค. ๋ณด์ ๋ด๋น์๋ ์ธ์ฐ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํฉ๋๋ค.
๊ฐ 4k ํ๋ ์ ์ํธํ
๋น๋์ค ์ฝ๋ฑ์ด ๊ฐ์๊ธฐ ์ํธํ๋ฅผ ์ํํด์ผ ํฉ๋๊น? ์๋๋ฉด ์ด์ ์ํธํ ๊ณ์ธต์ด ๋น๋์ค ์ฝ๋ฑ์ ์ดํดํด์ผ ํฉ๋๊น? ๋ฐ์ดํฐ ๋ณด์ ๊ณ์ธต์ ๋นํธ์คํธ๋ฆผ์ผ ๋ฟ์ ๋๋ค. ๋น๋์ค/๊ฒ๋ ๋ฐ์ดํฐ/์ด๋ฏธ์ง/๋ ์ ํ์ ๋ฑ์ด๋ผ๋ ์ฌ์ค์ ๋ณด์ ๊ณ์ธต โโ๋ฌธ์ ๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค. ์ ์ฒด ์๋ฃจ์ ์ ํต์ฌ ์ฑ ์์ ํผํฉํด์๋ ์๋ฉ๋๋ค.
NIST๋ ๊ธธ์ด๊ฐ 96๋นํธ๋ฅผ ์ด๊ณผํ๋ ๋ฌด์์ IV๋ฅผ ํ์ฉํฉ๋๋ค. NIST 800-38D ์ ์น์
8.2.2๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ฌ๊ธฐ์ ์๋ก์ด ๊ฒ์ ์์ผ๋ฉฐ nonce ์๊ตฌ ์ฌํญ์ CTR ๋ชจ๋์์ ์ ๊ณต๋ฉ๋๋ค. ์ด๊ฒ์ ๋ํ ๋๋ถ๋ถ์ ์คํธ๋ฆผ ์ํธ์์ ์๋นํ ํ์ค์ ์
๋๋ค. ๋๋ nonces์ ๋ํ ๊ฐ์์ค๋ฌ์ด ๋๋ ค์์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ํญ์ number used once
. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ INonce
๋
ผ์์ด ํฌ๋ฐํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ๋ ํ์ง๋ง ์ ์ด๋ ์คํธ๋ฆผ์ด ํ์ ์๋ ๋ถ๊ณผ์ ๊ฐ์ ํ์ ์ ์ ๊ฑฐํ์ง๋ ์์ต๋๋ค. AEAD ๋ณด์ + ์คํธ๋ฆฌ๋ฐ ์ํฌ๋ก๋ ํ์ ์ ์ป์ ์ ์๋ค๋ฉด ์ธ์ ๋ ์ง INonce
์ ์๋ณดํ๊ฒ ์ต๋๋ค. ๋๋ ํ์ ์คํธ๋ฆฌ๋ฐ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ๋งํ๋ ๊ฒ์ ์ซ์ดํฉ๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํด๋ณดํ ๊น๋ด ๋๋ ค์ํ๋ ๋ถ๋ถ์
๋๋ค.
๋๋ ์ง์ฅ์์ ๊ธด ํ๋ฃจ๋ฅผ ๋ณด๋ธ ํ ์ด๊ฒ์ ํ์ํ๊ธฐ ์ํด ์์ด๋ค๊ณผ ํจ๊ป ์ํ์ ๋ฐค์ ํฌ๊ธฐํ ์ฌ๋์ ๋๋ค. ๋๋ ํผ๊ณคํ๊ณ ํ๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต์ํ ์ผํ๋ "์์ํ ์ด์ " ๋๋ ๊ธฐํ ๋ถ๋๊ต๋ณด๋ค๋ ์ฌ์ค์ ๊ธฐ๋ฐํ ๊ณต๊ฐ ์ปค๋ฎค๋ํฐ ๋ํ๊ฐ ์์ด์ผ ํฉ๋๋ค. ์ ๋ ์์ ํ .NET ๋ฐ Azure ํ์ ์ ์ด์งํ๋ ์ฌ์ ์ ํ๊ณ ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์ผ์น๋ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ปค๋ฎค๋ํฐ Skype ํตํ๋ฅผ ํ ์ ์์ต๋๊น? ์ด์ฒ๋ผ ๋ณต์กํ ์ฃผ์ ๋ฅผ ํํํ๋ ๊ฒ์ ๊ฑฐ๋ํ ํ ์คํธ์ ๋ฒฝ์ ๋ถ๋ชํ๋๋ค. ์์๊ฒ ์ฃผ์ธ์?
Skype ํตํ๋ฅผ ํ์ง ๋ง์ญ์์ค. ์ปค๋ฎค๋ํฐ์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ก์ด ์๋ "๋น๊ณต๊ฐ ๋ชจ์"์ ์ ์์ ๋๋ค. Github ๋ฌธ์ ๋ ๋ชจ๋ ๋น์ฌ์๊ฐ ๋ฏผ์ฌ ๋ฌธ์ํ๋ ๋ด๋ก ์ ๊ฐ์ง ์ ์๋ ์ฌ๋ฐ๋ฅธ ์๋จ์ ๋๋ค(MS ์ฃผ์ ์ ๊ฑฐ ์ ๋ก ๋ฌด์).
MS Crypto Review Board๋ ์๋ง Skype ํตํ๋ฅผ ํ์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ด ์ค๋ ๋์ ์ฐธ์ฌํ๋ MS ์ฌ๋๋ค์ ์๋ชป์ด ์๋๋๋ค. ๊ทธ๋ค์ MS Crypto Review Board์ ์์ํ์ ๋ํ ์ ๊ทผ ๋ฐ ์ค๋๋ ฅ์ด ๋งค์ฐ ์ ํ์ ์ผ ๊ฒ์ ๋๋ค(๋ฌด์์ด๋ /๋๊ตฌ๋ ๊ฐ์).
์คํธ๋ฆฌ๋ฐ AEAD ๊ด๋ จ:
๋ฐ์ดํธ ํฌ๊ธฐ ์คํธ๋ฆฌ๋ฐ _encryption_์ GCM, CTR+HMAC์ ๊ฐ์ MAC ๋ง์ง๋ง ๋ชจ๋์์๋ ๊ฐ๋ฅํ์ง๋ง CCM๊ณผ ๊ฐ์ MAC ์ฐ์ ๋ชจ๋์์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ์ดํธ ํฌ๊ธฐ ์คํธ๋ฆฌ๋ฐ _decryption_์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ถ๋๋ฏ๋ก ๋๊ตฌ๋ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๋ธ๋ก ํฌ๊ธฐ ์คํธ๋ฆฌ๋ฐ _encryption_์ CBC+HMAC์์๋ ๊ฐ๋ฅํ์ง๋ง ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ฆ. AEAD ์คํธ๋ฆฌ๋ฐ์ ๋ํ ๋ฐ์ดํธ ํฌ๊ธฐ ๋๋ ๋ธ๋ก ํฌ๊ธฐ ์ ๊ทผ ๋ฐฉ์์๋ ๊ฒฐํจ์ด ์์ต๋๋ค.
์ฒญํฌ ํฌ๊ธฐ ์คํธ๋ฆฌ๋ฐ _encryption_ ๋ฐ _decryption_์ ํ๋ฅญํ๊ฒ ์๋ํ์ง๋ง ๋ ๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด์ด ์์ต๋๋ค.
๋ฒํผ๋ง์ด ํ์ํฉ๋๋ค(๋ธ๋ก ํฌ๊ธฐ ์ด์). ์ด๊ฒ์ ๋ฒํผ๋ง์ด ์ ์ด/์บกํ๋ ๊ฒฝ์ฐ(์: Inferno) ๋ผ์ด๋ธ๋ฌ๋ฆฌ/API์์ ์ํํ๊ฑฐ๋ ์ฒ๋ฆฌํ ์์ ๊ณ์ธต(ํธ์ถ ๊ณ์ธต)์ ๋จ๊ฒจ๋ ์ ์์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ ์๋ํฉ๋๋ค.
์ฒญํฌ ์คํธ๋ฆฌ๋ฐ AEAD๋ ํ์คํ๋์ง ์์์ต๋๋ค. ์ . nacl-stream , Inferno, MS ์์ DataProtection, ์์ฒด ์ ์.
์ด๊ฒ์ ์ง๊ธ๊น์ง ์ด ํ ๋ก ์ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ฏธ ์๊ณ ์๋ ๋ด์ฉ์ ์์ฝํ ๊ฒ์ ๋๋ค.
@sdrapkin , ๋ด๊ฐ ์ ๋๋ก ์ดํดํ๋์ง ํ์ธํ๊ธฐ ์ํด ์คํธ๋ฆฌ๋ฐ ์ํธํ๋ฅผ ์ ๊ณตํ์ง๋ง ์คํธ๋ฆฌ๋ฐ ๋ณตํธํ๋ฅผ ์ ๊ณตํ์ง ์๋ ์ด API๋ ๊ด์ฐฎ์ต๋๊น?
@sdrapkin ์ , ์ค์๊ฐ์ผ๋ก ๋ธ๋ ์ธ์คํ ๋ฐ์ ํ๋ ์ธ๊ฐ์ ํ์คํ ์ ์ตํฉ๋๋ค. ๊ธฐ๋ก ์ ์ง ๋ฌธ์ ๋ ํ์๋ก์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ธฐ์ ์ ์ธ ์ธก๋ฉด์ผ๋ก ๋์๊ฐ์ ์ฒญํน์ ์คํธ๋ฆฌ๋ฐ ์ํธ ํด๋ ์ ์ํด ์๋ํ์ง๋ง ๋ฎ์ ์์ค์ ๋ณด์ ๊ธฐ๋ณธ ์์๋ ์๋๋๋ค. ์ปค์คํ ํ๋กํ ์ฝ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ง์ ํ ๊ฒ๊ณผ ๊ฐ์ ๋นํ์ค ํ๋.
@morganbr
_์คํธ๋ฆฌ๋ฐ ์ํธํ๋ฅผ ์ ๊ณตํ์ง๋ง ์คํธ๋ฆฌ๋ฐ ๋ณตํธํ๋ ์ ๊ณตํ์ง ์๋ ์ด API๋ ๊ด์ฐฎ์ต๋๊น?_
์๋, ๋ ์๋์ผ. ๊ทธ๋ฌํ API๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋ฒํผ ๋ณตํธํ๋ก ํด๋ ํ ์ ์๋ ํฌ๊ธฐ์ ์คํธ๋ฆผ ์ํธํ ์ํธ๋ฌธ์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค(๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ).
^^^^ ์ด๊ฑด ์์ง๊น์ง ํฉ์๊ฐ ๋ง์ด ๋๊ฑด ์๋์ง๋ง ๋น๋์นญ API๊ฐ ์ด๋ป๊ฒ ๋๋ ๊ฐ์ ์ฌ์์ด ๋ ๊ฒ์ด๋ผ๋ ์ ์๋ ๋ชจ๋ ๋์ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. "ํค์ด๋ ์ํธํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์์กดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์คํธ๋ฆผ ์ํธ ํด๋ ๋ฐฉ๋ฒ์ ๋๋ค"์ ์์ @sdrapkin ์ฃผ์ ๋๋ฌธ์ ๋๋ค.
@Drawaes ๋์ํฉ๋๋ค. ๋น๋์นญ enc/dec API๋ ๋์ฐํ ๊ฒ์ ๋๋ค.
์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
๋ถ๋ช ํ ๋๋ โโ๋ช ๊ฐ์ง ๊ณต๊ฒฉ์ ํตํฉํ์ต๋๋ค.
์คํธ๋ฆผ ์ํธ(AES-CTR ๋ฐ AES-GCM์ด ์์)์ ๊ณ ์ ํ ์ฝ์ ์ ์์์ ์ผ๋ฐ ํ ์คํธ ๋ณต๊ตฌ๋ฅผ ํ์ฉํ๋ ์ ํ๋ ์ํธ๋ฌธ ๊ณต๊ฒฉ์ ํ์ฉํฉ๋๋ค. ์ ํ๋ ์ํธ๋ฌธ ๊ณต๊ฒฉ์ ๋ํ ๋ฐฉ์ด๋ ์ธ์ฆ์ ๋๋ค. ๊ทธ๋์ AES-GCM์ ๋ฉด์ญ์ด ๋ฉ๋๋ค... ์คํธ๋ฆฌ๋ฐ ๋ณตํธํ๋ฅผ ํ์ง ์๊ณ ๋ถ์ฑ๋ ๊ด์ฐฐ์์ ์ผ๋ฐ ํ ์คํธ๊ฐ ๋ฌด์์ธ์ง ์๋ณํ ์ ์๋ค๋ฉด ๋ง์ ๋๋ค. ์๋ฅผ ๋ค์ด, ํด๋ ๋ ๋ฐ์ดํฐ๊ฐ XML๋ก ์ฒ๋ฆฌ๋๋ ๊ฒฝ์ฐ ๊ณต๋ฐฑ ๋๋ < ์ด์ธ์ ๋ฌธ์๊ฐ ํด๋ ๋ ๋ฐ์ดํฐ์ ์์ ๋ถ๋ถ์ ์์ผ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ์คํจํฉ๋๋ค. ๊ทธ๋์ "์คํธ๋ฆฌ๋ฐ ์ํธ ํด๋ ์ ์คํธ๋ฆผ ์ํธ ์ค๊ณ์ ๋ํ ์ฐ๋ ค๋ฅผ ์ฌ๋์ ํฉ๋๋ค"(์ด๋ .NET์๋ ์ ํ ์์์ ๋์น์ฑ์ จ์ ์๋ ์์ต๋๋ค)์ ๋๋ค.
ํค ๋ณต๊ตฌ๊ฐ ์ด๋์์ ์๋์ง ์ฐพ๋ ๋์ ์ธ์ฆ ๊ณผ ๊ฐ์ ๋ฌธ์๊ฐ ์์ต๋๋ค.GCM(Ferguson/Microsoft)์ ์ฝ์ ์ด์ง๋ง ์งง์ ํ๊ทธ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ ํค๋ฅผ ๋ณต๊ตฌํ๋ ๊ฒ์ ๋๋ค(์ด๋ Windows ๊ตฌํ์์ 96๋นํธ ํ๊ทธ๋ง ํ์ฉํ๋ ์ด์ ์ ์ผ๋ถ์). ์คํธ๋ฆฌ๋ฐ GCM์ด ์ํํ ์ด์ ์ ๋ํด ๋ค๋ฅธ ์ธ์ฆ ํค ๋ณต๊ตฌ ๋ฒกํฐ์ ๋ํด ์กฐ์ธ์ ๋ฐ์์ ๊ฒ์ ๋๋ค.
์ด์ ๋๊ธ ์์ @sdrapkin ์ "๋ฐ์ดํธ ํฌ๊ธฐ ์คํธ๋ฆฌ๋ฐ ์ํธ ํด๋ ์ด ๊ทผ๋ณธ์ ์ผ๋ก ๋์ถ๋๊ณ ์์ผ๋ฏ๋ก ๋๊ตฌ๋ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ... ์คํธ๋ฆฌ๋ฐ AEAD์ ๋ํ ๋ฐ์ดํธ ํฌ๊ธฐ ๋๋ ๋ธ๋ก ํฌ๊ธฐ ์ ๊ทผ ๋ฐฉ์์๋ ๊ฒฐํจ์ด ์์ต๋๋ค."๋ผ๊ณ ์ธ๊ธํ์ต๋๋ค. ์คํธ๋ฆฌ๋ฐ ์ํธํ๋ฅผ ์ํํ ์ ์๋ CCM(๋ฐ SIV)๊ณผ ๊ฒฐํฉํ๊ณ ์คํธ๋ฆฌ๋ฐ ์ค ํ๋๋ ๊ฐ๊ณ ๋ค๋ฅธ ํ๋๋ ๊ฐ์ง ์๋ ๊ฒ์ด ์ด์ํ๋ค๋ ์๊ฒฌ์ ์ฐ๋ฆฌ๊ฐ ์์ท ์ํธํ ๋ฐ ํด๋ ํ๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ง์ง๋ง API ์ ์(https://github.com/dotnet/corefx/issues/23629#issuecomment-329202845)์ผ๋ก ๋์์จ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๋ ๋์ ์์ด ๋ฒ๋ฆฐ ๋ค๋ฅธ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด.
๋ค์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค @bartonjs
๋๋ ๊ณง ๊ทธ๋ฌ๋ ์ ์ ์ ์ ์ ๊ฒ์ด๋ค:
์ฐ๋ฆฌ๋ ์ด ์ค๋ ๋์์ ์ด์ ์ ๊ธฐ๋ณธ ๋์์ธ๊ณผ ํ๋กํ ์ฝ ๋์์ธ์ ๊ฒฐํฉํ์ต๋๋ค. ์ ํ๋ ์ํธ๋ฌธ ๊ณต๊ฒฉ์ ์์์ ์ธ ๋ฌธ์ ๊ฐ ์๋๋ผ ํ๋กํ ์ฝ ์ค๊ณ์ ๋ฌธ์ ๋ผ๊ณ ๋งํ๊ฒ ์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ AEAD ์ํธ ํด๋ ์ ์ฌ์ฉํ๋ฉด ์ต์ํ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ณดํธํ ์ ์์ผ๋ฉฐ ๋ง์ง๋ง ๋ฐ์ดํธ์์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ + ์ง์์ฑ์ผ๋ก ์ฆ์ ์ ๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค. AEAD์ ๋ํ ์คํธ๋ฆฌ๋ฐ ์ง์(์ฆ, ๊ธฐ์กด์ ๊ฐ์ธ ์ ๋ณด๋ง ํด๋น)์ด ์์ผ๋ฉด ์ฌ๋๋ค์ ๋ ๋ฎ์ ์์ค์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ง ์๊ตฌ์ ์ผ๋ก ์ ํํ๊ฒ ๋ฉ๋๋ค.
๊ธฐ์ ์ ์ธ ์ฅ์ ์ด ์ถฉ๋ถํ์ง ์๊ฑฐ๋ ๋ด ์ฃผ์ฅ์ ๊ถ์์ ๋ํด (๋น์ฐํ) ํ์์ ์ด๋ผ๋ฉด ๋๋ ์ธ๋ถ ๊ถ์ ๊ฒฝ๋ก๋ฅผ ์๋ํ ๊ฒ์
๋๋ค. ์ค์ ๊ธฐ๋ณธ ๊ตฌํ์ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋์์ AEAD(AES GCM ํฌํจ)๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ์์์ผ ํฉ๋๋ค. Windows ์ฝ์ด OS( bcrypt
)๋ BCryptEncrypt
๋๋ BCryptDecrypt
๊ธฐ๋ฅ์ ํตํด GCM์ ์คํธ๋ฆฌ๋ฐํ ์ ์์ต๋๋ค. ๊ฑฐ๊ธฐ์์ dwFlags ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋๋ ์ฌ์ฉ์ ์ฝ๋ ์์ . ๋๋ Microsoft ์ ์ CLR ๋ํผ . ๋๋ ๊ตฌํ์ด ์ฌํด ์ด์ NIST FIP-140-2 ์ธ์ฆ ์ ๋ฐ์์ต๋๋ค. ๋๋ Microsoft์ NIST ๋ชจ๋ AES ๊ตฌํ๊ณผ ๊ด๋ จํ์ฌ ์๋นํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ๊ธฐ ์ ์ฌ๊ธฐ์์ ์ธ์ฆํ์ต๋๋ค. ์ด ๋ชจ๋ ๊ฒ์๋ ๋ถ๊ตฌํ๊ณ ์๋ฌด๋ ์์์ธ์ ํํ์ง ์์์ต๋๋ค. .NET Core๊ฐ ๊ฐ์๊ธฐ ๋ํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ณธ ๊ตฌํ์ ์ฝํ์ํค๊ธฐ ์ํด ์์ฒด ์ํธํ ์ด๋ก ์ ๋ถ๊ณผํ๋ ๊ฒ์ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํนํ ์คํธ๋ฆฌ๋ฐ๊ณผ ์์ท์ ๋์์ ์ง์ํ ์ ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
๋? ์, ์์ ๋ด์ฉ์ '์ต์ ' evp API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ OpenSSL์ ํด๋นํฉ๋๋ค.
BouncyCastle์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
Java Cryptography Architecture์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
๊ฑด๋ฐฐ!
์๋
@sidshetye ++10 ํฌ๋ฆฝํ ๋ณด๋๊ฐ ๊ทธ๋ ๊ฒ ๊ฑฑ์ ๋๋ค๋ฉด ์ Windows CNG๊ฐ ์ด ์์ ์ ์ํํ๋๋ก ํฉ๋๊น?
Microsoft์ NIST FIPS-140-2 AES ์ ํจ์ฑ ๊ฒ์ฌ(์: # 4064 )๋ฅผ ํ์ธํ๋ฉด ๋ค์์ ํ์ธํ ์ ์์ต๋๋ค.
AES-GCM:
AES-CCM:
์คํธ๋ฆฌ๋ฐ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์์ต๋๋ค. NIST๊ฐ ๊ทธ ์๋ฅผ ํ์ธํ๋์ง ์ฌ๋ถ์กฐ์ฐจ ํ์คํ์ง ์์ต๋๋ค. AES-GCM ๊ตฌํ์ 64Gb ์ด์์ ์ผ๋ฐ ํ ์คํธ๋ฅผ ์ํธํํ๋๋ก ํ์ฉ๋์ด์๋ ์ ๋ฉ๋๋ค(GCM์ ๋ ๋ค๋ฅธ ํฐ๋ฌด๋์๋ ์ ํ).
๋ด ์ฌ์ฉ์ด 16k๋ฅผ ๋์ง ์์์ผํ๋ฏ๋ก ์คํธ๋ฆฌ๋ฐ์ ํฌ๊ฒ ์ง์ฐฉํ์ง๋ ์์ง๋ง ์กฐ๊ฐ๋ ๋ฒํผ๋ ํ๋ฅญํ๊ณ ์ ํ ์ํํ์ง ์์์ผํฉ๋๋ค (์ค์ ๋ก cng๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ ํํ ๊ทธ ๋ชฉ์ ์ ์ํด ๋ง๋ ๊ฒ์ผ๋ก ์์ฌ๋ฉ๋๋ค) ... ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๋ฒ์ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ(์: ์ฐ๊ฒฐ ๋ชฉ๋ก)์ ์ ๋ฌํ๊ณ ํ ๋ฒ์ ํด๋ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ฐ์ ๋ฒํผ๋ก ํด๋ ํ๋ฉด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ "์คํธ๋ฆฌ๋ฐ ์คํ์ผ" API์์ ์๋์ฐ ํฌ๋ฆฝํ ๋ณด๋๋ฅผ ์ด๋ํ๋ ๊ฒ์ ์ง๊ธ์ผ๋ก์๋ ์ ๋ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์์ผ๋ก ๋์๊ฐ์ ์์ท API๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ถฉ๋ถํ ์ฌ๋๋ค์ด ๋์ค์ ํ์๋ฅผ ํ์ํ๋ฉด API๋ฅผ ํ์ฅํ ์ ์๋ ์ฌ์ง๊ฐ ํญ์ ์์ต๋๋ค.
@sdrapkin ์์ ์ NIST Labs์ MSFT์์ ๊ด๋ฒ์ํ ๊ฒํ ๋ฅผ ๊ฑฐ์น ์คํธ๋ฆฌ๋ฐ API๋ผ๋ ๊ฒ์ ๋๋ค. ๊ฒ์ฆ๋๋ ๊ฐ ๋น๋๋ $80,000 - $50,000์ด๋ฉฐ MSFT(OpenSSL, Oracle ๋ฐ ๊ธฐํ ํฌ๋ฆฝํ ํค๋น๊ธ)๋ 10๋ ๋๊ฒ ์ด๋ฌํ API ๋ฐ ๊ตฌํ์ ๊ฒ์ฆํ๋ ๋ฐ ๋ง๋ํ ํฌ์๋ฅผ ํ์ต๋๋ค. .NET์ ์คํธ๋ฆฌ๋ฐ ๋๋ ์์ท์ ๊ด๊ณ์์ด 0, 8, 1016, 1024 ์ด์ธ์ ํฌ๊ธฐ๋ฅผ ์ง์ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ ๊ณํ์ ํน์ ์ผ๋ฐ ํ ์คํธ ํฌ๊ธฐ๋ก ์ธํด ์ฃผ์๊ฐ ์ฐ๋งํด์ง์ง ์๋๋ก ํฉ๋๋ค. ์์ ์ ์ ํฌ ํ ์คํธ๋ฅผ ๊ฑฐ์น ๋ชจ๋ API(๋ง ๊ทธ๋๋ก, ๋ฌด๊ธฐ ์ง์ ์์คํ ์์), ์ด๋ฌํ ๋ชจ๋ ํ๋ซํผ์์ ์ํธํ ๊ธฐ๋ณธ API ์์ค์์ ์คํธ๋ฆฌ๋ฐ AEAD๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ถํํ๋ ์ง๊ธ๊น์ง ์ด์ ๋ฐ๋ํ๋ ๋ชจ๋ ์ฃผ์ฅ์ ์ํธํ ๊ธฐ๋ณธ ์์ค์์ ์์ฌ ์ฐ๋ ค๋ก ์ธ์ฉ๋ ์์ฉ ํ๋ก๊ทธ๋จ ๋๋ ํ๋กํ ์ฝ ์์ค ๋ฌธ์ ์์ต๋๋ค.
์ ๋ '์ต๊ณ ์ ์์ด๋์ด๊ฐ ์น๋ฆฌํ๋๋ก ํฉ์๋ค'๋ฅผ ์ง์งํ์ง๋ง .net ํต์ฌ ์ํธํ ํ(MSFT ๋๋ ์ปค๋ฎค๋ํฐ)์ด ํ๊ธฐ์ ์ธ ๋ฐ๊ฒฌ์ ํ์ง ์๋ ํ, ๋ค๋ฅธ ๋ชจ๋ ์กฐ์ง์์ ์ง๊ธ๊น์ง ์ํธํ๋ฅผ ์ํํ๋ ๋ชจ๋ ์ฌ๋์ด ์ด๋ป๊ฒ ์๋ชป๋์๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ์ณ์ต๋๋ค.
์ถ์ : ์ฌ๊ธฐ์ ๋์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ ๋ชจ๋๋ ํ๋ซํผ๊ณผ ๊ณ ๊ฐ์๊ฒ ๊ฐ์ฅ ์ข์ ๊ฒ์ด ๋ฌด์์ธ์ง ์ํฉ๋๋ค.
@Drawaes ์ค๋๋ ์ ์๋๊ณ ์๋ AEAD ์ธํฐํ์ด์ค(๊ตฌํ์ด ์๋ ์๋ ์์)๊ฐ ์คํธ๋ฆฌ๋ฐ API ํ๋ฉด์ ์ง์ํ์ง ์๋ ํ ์ฌ๋๋ค์ด ๋ ๊ฐ์ ์ธํฐํ์ด์ค๋ ์ฌ์ฉ์ ์ ์ ์ธํฐํ์ด์ค ์์ด ์ด๋ป๊ฒ ํ์ฅํ ์ ์๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์์ด ๋ ๊ฒ์ ๋๋ค. ๋๋ ์ด ๋ ผ์๊ฐ ๋ฏธ๋๋ฅผ ๋ณด์ฅํ๋ ์ธํฐํ์ด์ค๋ก ์ด์ด์ง๊ธฐ๋ฅผ ๋ฐ๋๋๋ค(๋๋ ์ต์ํ ์๋ ๋์ ์กด์ฌํด ์จ ๋ค๋ฅธ AEAD ์ธํฐํ์ด์ค๋ฅผ ๋ฏธ๋ฌ๋งํฉ๋๋ค!).
๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ ์๋ฌด๋ฐ๋ ๋น ๋ฅด๊ฒ ์งํ๋์ง ์๊ณ ์์ผ๋ฉฐ, ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด 2.1 ๋ฒ์ ์ ๋๋ฌํ์ง ๋ชปํ๊ฑฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๊ฐ์ด ๋จ์ง ์์ ์ํ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ ์๊ธฐ์ ์ฒํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์์งํ ๋งํด์ ์์ ๋ํผ๋ก ๋์๊ฐ์ 2.0์ฉ์ผ๋ก ๊ฐ์กฐํ๊ณ ์์ต๋๋ค. ;)
Java , OpenSSL ๋๋ C# Bouncy Castle ๋๋ CLR Security ์ ๋ํ ๋ช ๊ฐ์ง ์ฐธ์กฐ API๊ฐ ์์ต๋๋ค. ์์งํ ๊ทธ๋ค ์ค ๋๊ตฌ๋ผ๋ ํ ๊ฒ์ด๊ณ ์ฅ๊ธฐ์ ์ผ๋ก ๋๋ C#์ด ๋ชจ๋ ์ํธํ ๊ตฌํ์ด ์ ํ๋ฆฝ๋ ์ธํฐํ์ด์ค์ ๋ฐ๋๋๋ Java์ 'Java ์ํธํ ์ํคํ ์ฒ' ์ ๊ฐ์ ๊ฒ์ ๊ฐ๊ณ ์ฌ์ฉ์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ต์ฒดํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฌ๊ธฐ๋ก ๋์๊ฐ์ .NET Core์ ICryptoTransform
์ธํฐํ์ด์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ํ์ฅํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
public interface IAuthenticatedCryptoTransform : ICryptoTransform
{
bool CanChainBlocks { get; }
byte[] GetTag();
void SetExpectedTag(byte[] tag);
}
๋ชจ๋ byte[]
๋ฅผ Span
$#$ ํ๋ ๊ฒฝ์ฐ ์ ๋ฐ์ ์ธ ์ผ๊ด์ฑ์ ์ํด System.Security.Cryptography
๋ค์์คํ์ด์ค์ ์ ์ฒด API์ ์นจํฌํด์ผ ํฉ๋๋ค.
ํธ์ง: JCA ๋งํฌ ์์
๋ชจ๋ byte[]๋ฅผ ํ์ฅํ๋ ๊ฒฝ์ฐ ์ ๋ฐ์ ์ธ ์ผ๊ด์ฑ์ ์ํด System.Security.Cryptography ๋ค์์คํ์ด์ค์ ์ ์ฒด API์ ์นจํฌํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ICryptoTransform์ ์ ์ธํ ๋ชจ๋ ๊ฒ.
.NET Core์ ICryptoTransform์ ํ์ฅํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๋ฌธ์ ๋ ํธ์ถ ํจํด์ด ๋์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ๋งค์ฐ ์ด์ํ๋ค๋ ๊ฒ์ ๋๋ค(ํนํ CryptoStream์ด ๊ด๋ จ๋ ๊ฒฝ์ฐ). ์ด๊ฑฐ ์๋ ์ผ๋๋ฐ ์ด์ค๋ฝ๋ค์. GCM ๋งค๊ฐ๋ณ์๊ฐ CBC/ECB ๋งค๊ฐ๋ณ์์ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ค ํ๋๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ ์์ต๋๋ค.
์ฌ๊ธฐ ๋ด ์๊ฐ์ด ์์ต๋๋ค.
๊ทธ ๋ชฉ์ ์ ๋ํ ๋ด ์๋นํ ์์์ ์ธ ์๊ฐ(๊ธฐ์กด ์ ์์ ์ถ๊ฐํ์ฌ ์์ท์ด ๋จ์ ์์ง๋ง ์ถ์ ๋์ ๊ฐ์ ๊ธฐ๋ณธ impl๋ก ์ถ์ธก):
```C#
๋ถ๋ถ ํด๋์ค AuthenticatedEncryptor
{
// ์์
์ด ์ด๋ฏธ ์งํ ์ค์ด๋ฉด throw
๊ณต๊ฐ ์ถ์ ๋ฌดํจ ์ด๊ธฐํ(ReadOnlySpan
// ์ฑ๊ณตํ๋ฉด true, "destination too small"์ด๋ฉด false, ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์์ธ์
๋๋ค.
๊ณต๊ฐ ์ถ์ bool TryEncrypt(ReadOnlySpan
// ๋๋จธ์ง EncryptedData๊ฐ ๋๋ฌด ์์ผ๋ฉด false, ๋ค๋ฅธ ์
๋ ฅ์ด ๋๋ฌด ์์ผ๋ฉด throw๋ฉ๋๋ค. NonceOrIVSizeInBits ๋ฐ TagSizeInBits ์์ฑ์ ์ฐธ์กฐํ์ธ์.
// NonceOrIvUsed๋ Initialize๋ก ์ด๋ํ ์ ์์ง๋ง ์
๋ ฅ์ผ๋ก ํด์๋ ์ ์์ต๋๋ค.
๊ณต๊ฐ ์ถ์ bool TryFinish(ReadOnlySpan
}
๋ถ๋ถ ํด๋์ค AuthenticatedDecryptor
{
// ์์
์ด ์ด๋ฏธ ์งํ ์ค์ด๋ฉด throw
๊ณต๊ฐ ์ถ์ ๋ฌดํจ ์ด๊ธฐํ(ReadOnlySpan
// ์ฑ๊ณตํ๋ฉด true, "destination too small"์ด๋ฉด false, ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์์ธ์
๋๋ค.
๊ณต๊ฐ ์ถ์ bool TryDecrypt(ReadOnlySpan
// ์๋ชป๋ ํ๊ทธ๊ฐ ๋ฐ์ํ์ง๋ง ์ด์จ๋ ๋ฐ์ดํฐ๊ฐ ๋์ถ๋ ์ ์์ต๋๋ค.
// (remainingDecryptedData๋ CBC+HMAC์ ํ์ํ๋ฏ๋ก ๋๋จธ์ง ๋ฐ์ดํฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.)
๊ณต๊ฐ ์ถ์ bool TryFinish(ReadOnlySpan
}
```
AssociatedData๋ ๋ง์ง๋ง์ผ๋ก ํ์ํ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ฅผ ์ ์งํ ์ ์๊ณ ๋จผ์ ์ด๋ฅผ ํ์๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ Initialize์์ ์ ๊ณต๋ฉ๋๋ค.
์คํธ๋ฆฌ๋ฐ์ด ์ด๋ค ๋ชจ์ต์ผ์ง์ ๋ํ ๋ชจ์์ด ๊ฒฐ์ ๋๋ฉด(๊ทธ๋ฆฌ๊ณ ์ฌ๋๋ค์ด CCM์ด ์คํธ๋ฆฌ๋ฐ ์ํธํ ๋ชจ๋์ ์์ ๋ ๋ด๋ถ์ ์ผ๋ก ๋ฒํผ๋ง๋์ด์ผ ํ๋์ง ์๋๋ฉด ๋์ ธ์ผ ํ๋์ง ์๊ฐํ๋์ง ์ฌ๋ถ) ๋ค์ ๊ฒ์ํ์ผ๋ก ๋์๊ฐ๊ฒ ์ต๋๋ค.
@bartonjs ์ํธํ/์ํธ ํด๋ ์ ๋ฐ์ ๊ฑธ์ณ ๋์นญ์ ์ํด ์คํธ๋ฆผ ๋์์ ํ๊ทธ๋ฅผ ๋ฝ๊ณ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ ๋ํด ๋ฌด์จ ๋ง์ธ์ง ์๋๋ค. ๊น๋ค๋กญ์ง๋ง ๊ฐ ์ฌ์ฉ์๊ฐ ํด๊ฒฐํ๋๋ก ๋จ๊ฒจ๋๋ฉด ๋ ๋์ฉ๋๋ค. MIT์์ ๊ณต์ ํ ์ ์๋ ๊ตฌํ์ด ์์ต๋๋ค. ๋ด ํ๊ณผ ๋ด๋ถ์ ์ผ๋ก ๊ฒํ ํด์ผ ํจ(๋ด ์ฑ ์/๋ชจ๋ฐ์ผ์ด ์๋)
์ค๊ฐ ์ง์ ์ OpenSSL ๋๋ NT์ bcrypt์ ๊ฐ์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ํ๊ทธ ๋น๊ต๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ต์ข
์ํธ ํด๋
ํธ์ถ ์ง์ ์ ํ๊ทธ๋ฅผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด SetExpectedTag
(์ต์ข
์ํธ ํด๋
์ ) ๋ฐ GetTag
(์ต์ข
์ํธํ ํ)๋ ์๋ํ์ง๋ง ์ฌ์ฉ์์๊ฒ ํ๊ทธ ๊ด๋ฆฌ ๋ถ๋ด์ ๋์ด์ค๋๋ค. ๋๋ถ๋ถ์ ์์ฐ์ค๋ฌ์ด ์๊ฐ ์์์ด๊ธฐ ๋๋ฌธ์ ์ํธ ์คํธ๋ฆผ์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
Initialize
์์ฒด(์ํธ ํด๋
์)์ ์๋ ํ๊ทธ๋ฅผ ๊ธฐ๋ํ๋ฉด ๊ณต๊ฐ(๋ฐ์ดํธ ํ๋ฆ)๊ณผ ์๊ฐ(์์์ด ์๋ ๋์์ ํ๊ทธ ํ์ธ)์ ๋์นญ์ด ๊นจ์ ธ ์ ์ฉ์ฑ์ด ์ ํ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ ํ๊ทธ API๋ ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋ํ ์ํธํ์ ๊ฒฝ์ฐ Initialize
๋ ์ํธํ ๋ณํ ์ ์ IV๊ฐ ํ์ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ํธํ ๋ฐ ์ํธ ํด๋
์ ์ํด Initialize
๋ ๋ณํ ์ ์ AES ์ํธํ ํค๊ฐ ํ์ํฉ๋๋ค. (๋ช
๋ฐฑํ ๊ฒ์ด ๋๋ฝ๋์๊ฑฐ๋ ํด๋น ๋นํธ๋ฅผ ์
๋ ฅํ๋ ๊ฒ์ ์์ผ์
จ์ต๋๊น?)
์ด๊ธฐํ ์์ฒด(๋ณตํธํ ์)์์ ํ๊ทธ๋ฅผ ๊ธฐ๋ํ๋ฉด ๋์นญ์ด ๊นจ์ง๋๋ค.
CBC+HMAC์์ ์ผ๋ฐ์ ์ธ ๊ถ์ฅ ์ฌํญ์ ๋ณตํธํ๋ฅผ ์์ํ๊ธฐ ์ ์ HMAC๋ฅผ ํ์ธํ๋ ๊ฒ์ด๋ฏ๋ก ํ๊ทธ ์ฐ์ ๋ณตํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ์ฐ ์ค์ ํ๊ทธ์ ๋ํด ํ๊ดด์ ์ธ ์์ ์ ์ํํ๊ณ ์ต์ข ์๋ต์ด 0์ธ์ง ํ์ธํ๋ "์์ AE" ์๊ณ ๋ฆฌ์ฆ์ด ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ ๊ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จผ์ ์ด๋ฅผ ํ์๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์์ ์ ์์ผ๋ฏ๋ก ์์ ํ ์ผ๋ฐํ๋ API์์ ๊ฐ์ฅ ๋จผ์ ๋ฑ์ฅํฉ๋๋ค.
SetAssociatedData
๋ฐ SetTag
์ ๋์ฐ๋ฉด ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋
๋ฆฝ์ ์ด์ง๋ง ์ฌ์ฉ๋ฒ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ข
์๋๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. AesGcm๋ฅผ AesCbcHmacSha256 ๋๋ SomeTagDesctructiveAlgorithm์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ํ๊ทธ๊ฐ ์์ง ์ ๊ณต๋์ง ์์๊ธฐ ๋๋ฌธ์ TryDecrypt๊ฐ ๋ฐ์ํฉ๋๋ค. ๋์๊ฒ ๊ทธ๊ฒ์ ์ ํ ๋คํ์ฑ์ด ์๋ ๊ฒ๋ณด๋ค ๋์ฉ๋๋ค. ๋ฐ๋ผ์ ์ ์ฐ์ฑ์ ํ์ฉํ๋ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ๋ณ๋ก ์์ ํ ๋ถ๋ฆฌ๋๋๋ก ๋ชจ๋ธ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค. (์, NeedsTagFirst
์ ๊ฐ์ ๋ ๋ง์ ์๊ณ ๋ฆฌ์ฆ ์๋ณ ํน์ฑ ์์ฑ์ผ๋ก ์ ์ดํ ์ ์์ง๋ง ์ค์ ๋ก๋ ์ฌ์ฉํ๊ธฐ ๋ ์ด๋ ค์์ง๋๋ค)
๋ํ ์ํธํ์ ๊ฒฝ์ฐ ์ด๊ธฐํ๋ ์ํธํ ๋ณํ ์ ์ IV๊ฐ ํ์ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ํธํ ๋ฐ ์ํธ ํด๋ ์ ์ํด Initialize๋ ๋ณํ ์ ์ AES ์ํธํ ํค๊ฐ ํ์ํฉ๋๋ค.
ํค๋ ํด๋์ค ctor ๋งค๊ฐ๋ณ์์์ต๋๋ค. IV/nonce๋ ctor ๋งค๊ฐ๋ณ์์ IV/nonce ๊ณต๊ธ์์์ ๊ฐ์ ธ์ต๋๋ค.
๊ณต๊ธ์ ๋ชจ๋ธ์ ์ํธํ ์ค์ IV๊ฐ ์ ๊ณต๋์ง ์๊ณ ๋ฐ์ดํฐ ๋์ ์์ฑ๋๋ SIV๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด SIV์ ๋งค๊ฐ๋ณ์๊ฐ ์๊ณ ๋น ๊ฐ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์๋๋ฉด ๊ทธ ๋นํธ๋ฅผ ์ ๋ ฅํ๋ ๊ฒ์ ์์ผ์ จ์ต๋๊น?
์คํธ๋ฆฌ๋ฐ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ํค ๋ฐ IV/nonce ๊ณต๊ธ์๊ฐ ctor ๋งค๊ฐ๋ณ์๋ก ํฌํจ๋ ๊ธฐ์กด ์ ์์ ์ถ๊ฐ๋๊ณ ์์์ต๋๋ค.
@bartonjs : ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ๋จผ์ ํ๊ทธ๋ฅผ ์ง์ ํ๊ณ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ง๋ง์ ํ๊ทธ๋ฅผ ์ง์ ํ ์ ์๋ค๋ ์ข์ ์ ๊ณผ ์๋ ์ฌ์์ ์ถ๊ฐ๋ ๊ฒ์์ ์๊ธฐ์์ผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ๋ ์ฝ๋ค๋ ๊ฒ์ ์์์ผ๋ฏ๋ก ๋ค์์ ํด๋ผ์ฐ๋ ์ฐ์ ์์ ๋๋ค.
์คํ ๋ฆฌ์ง์ ๋ณด๊ด๋ ํ๋ ์ด์์ 10GB AES-GCM ์ํธํ ํ์ผ(์: ์ํธ๋ฌธ ๋ค์ ํ๊ทธ)์ ๋ํ ๋ถ์์ ์ํํ ๊ฒ์ ๋๋ค. ๋ถ์ ์์ ์๋ ๋์์ ์ฌ๋ฌ ์ธ๋ฐ์ด๋ ์คํธ๋ฆผ์ ๋ณ๋์ ์์คํ /ํด๋ฌ์คํฐ๋ก ํด๋ ํ๊ณ ๋ง์ง๋ง ๋ฐ์ดํธ + ํ๊ทธ ํ์ธ ํ ๊ฐ ๋ถ์ ์ํฌ๋ก๋๋ฅผ ์์ํฉ๋๋ค. ๋ชจ๋ ์คํ ๋ฆฌ์ง, ์์ ์, ๋ถ์ VM์ Azure US-West์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๋ชจ๋ ์คํธ๋ฆผ์ ๋์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ AuthenticatedDecryptor์ Initialize
๋ฉ์๋์ ์ ๊ณตํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ GCM ์ฌ์ฉ์ ์ํ ์ฝ๋ ์์ ์ ์์ํ์ฌ๋ API ์ฌ์ฉ์ ์์ํ ์ ์์ต๋๋ค.
์๊ฐํด ๋ณด๋ฉด ๋ค์ํ AEAD๋ฅผ ์์ฉํ๊ณ ์ฌ์ฉ์ ์ฝ๋ ๋ณ๊ฒฝ์ด ์๋ API๋ฅผ ๊ฐ์ง ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ค์ํ AEAD ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์ํธํ ๊ณต๊ธ์๊ฐ ํ๊ทธ๋ฅผ ์๋์ผ๋ก ๋ง์ ์ฒ๋ผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. Java๋ GCM์ ๋ํ ์ํธ๋ฌธ์ ๋์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฅผ ์ํํ๊ณ ์ฌ์ฉ์ ๊ฐ์ ์์ด ๋ณตํธํํ๋ ๋์ ์ ๊ฑฐํฉ๋๋ค. ๊ทธ ์ธ์ ๋๊ตฐ๊ฐ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ํฌ๊ฒ ๋ณ๊ฒฝํ ๋๋ง๋ค(์: CBC-HMAC => GCM) ํ๊ทธ ์ฐ์ ์ฒ๋ฆฌ์ ํ๊ทธ ํ ์ฒ๋ฆฌ์ ์ํธ ๋ฐฐํ์ ํน์ฑ ๋๋ฌธ์ ์ฝ๋๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
IMHO, ๋จผ์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๋๋
์ต์ 1์ ๋ฒํผ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋น์์ ์ ๋ฐ์ ์ธ ๊ฒฝํ์ ์ ๋ง ๋จ์ํํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ํ๋ฉด ์ด์ ๊ฐ ์ฌ์ฉ์๊ฐ ๋งค๋ฒ ํ์ง ์์๋ ๋ฉ๋๋ค. ๋ํ ๋ชจ๋ AEAD๋ ๋์ผํ ์ธํฐํ์ด์ค(ํ๊ทธ ์ฐ์ , ํ๊ทธ ํ, ํ๊ทธ ์์)๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๊ณ ๋ฆฌ์ฆ ๊ต์ฒด๋ ๋ ๊ฐ๋จํฉ๋๋ค.
๋ด ํฌํ๋ ์ต์ 1์ ๋ํ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก GCM์ ํตํ ICryptoTransform
์คํธ๋ฆฌ๋ฐ ์์
์ด ํ๊ทธ ์ธ์คํธ๋ฆผ ์์ค ๋ฅผ ์๋์ผ๋ก ๋ฝ์ ์ ์๋๋ก ๊ตฌํ์ ํํค์น ์ ์์์ต๋๋ค. ์ด๊ฒ์ CLR Security์ ์์ฒด ๋ํผ์ ๋ํ ์ค์ํ ์
๋ฐ์ดํธ์์ผ๋ฉฐ ์ถ๊ฐ ๋ฒํผ ๋ณต์ฌ๋ณธ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ๋งค์ฐ ๋น ๋ฆ
๋๋ค(Windows 10 ๋ถํธ์บ ํ์ ํ
์คํธ macbook pro์์ ~4GB/์ด). ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก CLR Security๋ฅผ โโ๋๋ฌ์ธ์ ์ฐ๋ฆฌ ์์ ์ ์ํ ์ต์
1์ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ ๊ณณ์์๋ ๊ทธ๊ฒ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด ๋น์ฃผ์ผ ์ ICryptoTransform
์ธํฐํ์ด์ค์ TransformBlock
๋ฐ TransformFinalBlock
๋ด์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ค๋ช
ํ๋ ๋ฐ ์ ๋ง ๋์์ด ๋ฉ๋๋ค.
@sidshetye ํด๋ผ์ฐ๋ ์ฐ์ ์์ ๊ฐ ์ฐจ๋จ๋ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ์ฅ์์์ ์ฝ๋ ๊ฒฝ์ฐ ๋ง์ง๋ง ๋ช ๊ฐ์ ํ๊ทธ ๋ฐ์ดํธ๋ฅผ ๋จผ์ ๋ค์ด๋ก๋ํ๊ณ ์ํธ ํด๋
๊ธฐ ctor์ ์ ๊ณตํ ์ ์์ต๋๋ค. Azure Storage API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ CloudBlockBlob.DownloadRangeXxx
๋ฅผ ํตํด ์ํ๋ฉ๋๋ค.
@GrabYourPitchforks ํด๋น ์์ ์์ ๋๋ฌด ๋ฒ์ด๋์ง ์๋๋ก ํด์ผ ํ์ง๋ง ์ด๋ Azure Blob Storage์ ํน์ ๊ธฐ๋ฅ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก VM ๊ธฐ๋ฐ ์คํ ๋ฆฌ์ง(IaaS) ๋๋ ๋น Azure Storage ์ํฌ๋ก๋๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฒ์ํ ์ ์๋ ๋คํธ์ํฌ ์คํธ๋ฆผ์ ์ป์ต๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก @GrabYourPitchforks ๋ฅผ ๋ณด๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
์คํ ๋ฆฌ์ง์ ๋ณด๊ด๋ ํ๋ ์ด์์ 10GB AES-GCM ์ํธํ ํ์ผ(์: ์ํธ๋ฌธ ๋ค์ ํ๊ทธ)์ ๋ํ ๋ถ์์ ์ํํ ๊ฒ์ ๋๋ค. ๋ถ์ ์์ ์๋ ๋์์ ์ฌ๋ฌ ์ธ๋ฐ์ด๋ ์คํธ๋ฆผ์ ๋ณ๋์ ์์คํ /ํด๋ฌ์คํฐ๋ก ํด๋ ํ๊ณ ๋ง์ง๋ง ๋ฐ์ดํธ + ํ๊ทธ ํ์ธ ํ ๊ฐ ๋ถ์ ์ํฌ๋ก๋๋ฅผ ์์ํฉ๋๋ค. ๋ชจ๋ ์คํ ๋ฆฌ์ง, ์์ ์, ๋ถ์ VM์ Azure US-West์ ์์ต๋๋ค.
@sidshetye , ๋น์ ์ ๋ฉ์ฒญํ๊ณ ์ํํ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋๋ํ๊ณ ํฌ์น ๊ฐ๋ฅํ ํ๋กํ ์ฝ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ํด ๋งค์ฐ ๋จํธํ์ต๋๋ค! ๋๋ ๊ฟ์ด ์์๊ณ ๊ทธ๊ฒ์ ๋ฏฟ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋์ง๋๋ค. ์ด๊ฒ์ ํ๋กํ ์ฝ - ์์คํ ์ค๊ณ์ ๋๋ค. ๋น์ ์ด ์ค๋ช ํ ํ๋กํ ์ฝ์ ์ค๊ณํ ์ฌ๋์ ์๋ง์ ๋๋ค. ๋ฅ๊ทผ ๊ตฌ๋ฉ์ ๋ค๋ชจ๋ ๋ชป์ ๋ผ์ธ ์ ์๋ค๊ณ ์ฐ๋ ๊ฒ์ ์ด์ ์์ฉ์ด ์์ต๋๋ค.
GCM์ผ๋ก ์ํธํ๋ 10Gb ํ์ผ์ด ๋๊ตฌ๊ฑด ๊ฐ์ ์ํํ ์ ๋๋ก ์์ ์์ง(64Gb ์ดํ์๋ GCM์ด ์ข์ง ์์)์ ๊ฐ๊น์ด ์ด๊ณ ์์ ๋ฟ๋ง ์๋๋ผ ์ ์ฒด ์ํธ๋ฌธ์ ๋ฒํผ๋งํด์ผ ํ๋ค๋ ์์์ ์ธ ์ฃผ์ฅ๋ ์์์ต๋๋ค.
10Gb ํ์ผ์ GCM์ผ๋ก ์ํธํํ๋ ์ฌ๋์ ์๋์ ์ธ ํ๋ฅ ๋ก ํ๋กํ ์ฝ ์ค์๋ฅผ ์ ์ง๋ฅด๊ณ ์์ต๋๋ค. ์๋ฃจ์ : ์ฒญํฌ ์ํธํ. TLS์๋ ๊ฐ๋ณ ๊ธธ์ด 16k๋ก ์ ํ๋ ์ฒญํน์ด ์์ผ๋ฉฐ ๋ ๊ฐ๋จํ๊ณ PKI๊ฐ ์๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด ๊ฐ์ ์์ ์ "ํด๋ผ์ฐ๋ ์ฐ์ " ์ฑ์ ๋งค๋ ฅ์ ๋์์ธ ์ค์๋ฅผ ์ค์ด์ง ์์ต๋๋ค.
(์ด ์ค๋ ๋์ ๋ํด ๋ฐ๋ผ์ก์ ์ผ์ด ๋ง์ด ์์ต๋๋ค.)
@sdrapkin ์ ๋ฐ์ดํฐ ๋ณดํธ ๊ณ์ธต์์ IAuthenticatedEncryptor
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ง์ ํ์ต๋๋ค. ์์งํ ๋งํด์ ๋ฐ์ดํฐ ๋ณดํธ ๊ณ์ธต์ด ์ํธํ๋ฅผ ์ํํ๋ ๋ฐฉ์์ ๋ํด ์๋นํ ๋
๋จ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์ถ์ํ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, IV ๋๋ nonce์ ์์ฒด ์ ํ์ ๊ธ์งํ๊ณ ์ค์ ๊ตฌํ์ด AAD์ ๊ฐ๋
์ ์ดํดํ๋๋ก ์๊ตฌํ๋ฉฐ ๋ค์ ๋
์ ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค. AES-GCM์ ๊ฒฝ์ฐ IAuthenticatedEncryptor.Encrypt
์ ๋ฐํ ๊ฐ์ ํ์ ํค ํ์์ ์ฌ์ฉ๋๋ ๊ฑฐ์ ์๋ฌด ๊ฒ๋ ์๋ ์ด์ํ ๊ฒ์ ์ฐ๊ฒฐ์
๋๋ค. ์ํธ๋ฌธ์ ์ ๊ณต๋ ์ผ๋ฐ ํ
์คํธ์ ๋ํด AES-GCM์ ์คํํ ๊ฒฐ๊ณผ์
๋๋ค(๊ทธ๋ฌ๋ AAD!) ๋ฐ AES-GCM ํ๊ทธ. ๋ฐ๋ผ์ ๋ณดํธ๋ ํ์ด๋ก๋ ์์ฑ๊ณผ ๊ด๋ จ๋ ๊ฐ ๋จ๊ณ๋ ์์ ํ์ง๋ง ํ์ด๋ก๋ ์์ฒด๋ ์ด๋ค ์ ํ์ ์น์ธ๋ ๊ท์น๋ ๋ฐ๋ฅด์ง ์์ผ๋ฉฐ ๊ฒฐ๊ณผ ์ํธ๋ฌธ์ ์ฑ๊ณต์ ์ผ๋ก ํด๋
ํ ์ ์๋ ๋ฐ์ดํฐ ๋ณดํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์๋ ์๋ฌด๋ ์ฐพ์ง ๋ชปํ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ฑ ๊ฐ๋ฐ์ ๋๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ข์ ํ๋ณด์ด์ง๋ง ํ๋ฆฌ๋ฏธํฐ๋ธ์ ์ํด ๊ตฌํ๋๋ ์ธํฐํ์ด์ค์๋ ๋์ฐํ ํ๋ณด๊ฐ ๋ฉ๋๋ค.
๋ํ ๋ชจ๋ ์ธ์ฆ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด ๊ตฌํํด์ผ ํ๋ One True Interface(tm) IAuthenticatedEncryptionAlgorithm
๋ฅผ ๊ฐ๋ ๊ฒ์์ ์๋นํ ๊ฐ์น๋ฅผ ๋ณด์ง ๋ชปํ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ ๋จ์ํ ๋ธ๋ก ์ํธ ํ๋ฆฌ๋ฏธํฐ๋ธ ๋๋ ํด์ฑ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ฌ๋ฆฌ "๋ณต์ก"ํฉ๋๋ค. ์ด๋ฌํ ๋ณต์กํ ํ๋ฆฌ๋ฏธํฐ๋ธ์๋ ๋ณ์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค. ์์ AE๋ง์
๋๊น, ์๋๋ฉด AEAD์
๋๊น? ์๊ณ ๋ฆฌ์ฆ์ด IV/nonce๋ฅผ ์ ํ ํ์ฉํฉ๋๊น? (๋๋ ๊ทธ๋ ์ง ์์ ๊ฒ์ ๋ณด์์ต๋๋ค.) ์
๋ ฅ IV / nonce ๋๋ ๋ฐ์ดํฐ๊ฐ ๊ตฌ์กฐํ๋์ด์ผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๊น? IMO ๋ณต์กํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ ๋จ์ํ ๋
๋ฆฝํ API์ฌ์ผ ํ๋ฉฐ ์์ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ด์ฌ ์๋ ํน์ ๋ณต์กํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ง์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋๋ฆฌ์ค์ ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ๊ท ์ผํ API๋ฅผ ๋
ธ์ถํฉ๋๋ค.
@sdrapkin ๋ค์ ์ฃผ์ ์์ ๋ฒ์ด๋ฉ๋๋ค. ์์คํ ์ด ๊ธฐ๋ณธ ์์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋์๋ค๊ณ ๋งํ ๋ฟ์ ๋๋ค. ์ฌ๊ธฐ์์ ์ํธํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ ์์ํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค. ์์คํ /ํ๋กํ ์ฝ ๊ณ์ธต์ด ๋ฒํผ๋ง์ ์ฒ๋ฆฌํ๋ ๋์; ๊ทธ๊ฒ๋ ํด๋ฌ์คํฐ ์์ค์์, ํ์คํ ์์ท ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ๊ฐ์ ํ๋ ๋ฉ์ธ ์์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋๋๋ค. '์ฒญํน' ๊ฒฝ๊ณ๋ 64GB ๋ฏธ๋ง์ด๋ฏ๋ก X(์ฌ๊ธฐ์ X=10GB)์ ๋๋ค. ํด๋ฌ์คํฐ์ ๋ฒํผ๋ง ์ฉ๋์ด ๊ฑฐ์ ๋ฌด์ ํ์ด์๊ณ ๋ง์ง๋ง ๋ฐ์ดํธ๊ฐ ํด๋ฌ์คํฐ์ ๋ก๋๋ ๋๊น์ง ์๋ฌด๊ฒ๋ ์์ํ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ์ ์ ํํ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ์ด๋ฉฐ, ๋ด๊ฐ ์ด์ผ๊ธฐํ ๊ฐ์ ์ ๋ํด ๊ฐ ๋ ์ด์ด๋ฅผ ์ต์ ํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๊ธฐ๋ณธ ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์์ ๋ ์ด์ด ๋์์ธ/์ ํ์ ํธ๋์บกํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํ ์ ์์ต๋๋ค(๋ ๋ง์ ์ค์ ์ฑ์๋ ๊ณ ์ ํ ๋ ๊ฑฐ์ ํธ๋์บก์ด ์์).
NIST 800-38d sec9.1์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์น์ธ๋์ง ์์ ๋น์ฌ์๊ฐ IV ์์ฑ์ ์ ์ดํ๊ฑฐ๋ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด,
GCM์ ๋ค์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ์ํธํ ๋ชจ๋ ๋ด์์๋ง ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
FIPS ํ. 140-2. ํนํ ๋ชจ๋์ ์ํธํ ๊ฒฝ๊ณ๋ ๋ค์์ ํฌํจํด์ผ ํฉ๋๋ค.
Sec.์ ๊ตฌ์ฑ ์ค ํ๋์ ๋ฐ๋ผ IV๋ฅผ ์์ฐํ๋ "์์ฑ ์ฅ์น". 8.2 ์.
FIPS 140-2์ ์๊ตฌ ์ฌํญ์ ๋ํ ๊ฒ์ฆ์ ์ํ ๋ชจ๋์ ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
๋ชจ๋์ด IV์ ๊ณ ์ ์ฑ ์๊ตฌ ์ฌํญ์ ์ค์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ด๋ GCM IV๊ฐ ๋ด๋ถ์ ์ผ๋ก ์๋ ์์ฑ๋์ด์ผ ํ๋ฉฐ ์ธ๋ถ์ ์ผ๋ก ์ ๋ฌ๋์ง ์์์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
@sdrapkin ์ข์ ์ง์ ์ด์ง๋ง ๋ ์์ธํ ์ฝ์ด๋ณด๋ฉด 96๋นํธ ์ด์์ IV ๊ธธ์ด์ ๋ํด ์น์ 8.2.2์์ ์ต์ 96๋นํธ๊ฐ ๋ฌด์์์ธ RBG(์์ ๋นํธ ์์ฑ๊ธฐ)๋ก IV๋ฅผ ์์ฑํ ์ ์์์ ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋นํธ๋ 0์ผ ์ ์์). ๋๋ ์ง๋ ๋ฌ ์ด ์ค๋ ๋ ์์ฒด์ ๋ํด ์ธ๊ธํ์ต๋๋ค( ์ฌ๊ธฐ์๋ nonce ์๋์ ์์).
LT;DR: INonce
๋ NIST ๋ฐ FIPS ์ง์นจ์ ์ค์ํ์ง ์๋ ํจ์ ์
๋๋ค.
์น์ 9.1์ FIPS 140-2์ ๊ฒฝ์ฐ IV ์์ฑ ์ฅ์น(์์ ํ ์์์ ์ฆ, 8.2.2์ ๋๋ ๊ฒฐ์ ๋ก ์ ๊ตฌํ, ์ฆ 8.2.1์ )๊ฐ FIPS ๊ฒ์ฆ์ ๋ฐ๋ ๋ชจ๋ ๊ฒฝ๊ณ ๋ด์ ์์ด์ผ ํ๋ค๊ณ ๋งํฉ๋๋ค. ๋ถํฐ ...
... FIPS ์ธ์ฆ์ ๋ฐ๋ ๋๋ถ๋ถ์ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ค๋ผํด์ Java, WinNT์ bcryptprimitives, OpenSSL ๋ฑ ์ฐธ์กฐ)๋ IV์ฉ RBG ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ๋จ์ํ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. INonce
์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ ๊ฒ์ ์ค์ ๋ก NIST ๋ฐ FIPS์ ๊ด์ ์์ ๋ณด๋ฉด ํจ์ ์
๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋น ์ธํฐํ์ด์ค์ ๊ตฌํ์ ์ํธํ ๊ธฐ๋ฅ์ ์ ๋ฌํด์ผ ํจ์ ์์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ INonce
์ ๋ชจ๋ ์ฌ์ฉ์ ๊ตฌํ์ 9๊ฐ์ ์ด์ ๋ฐ $50K ์ด์์ NIST ์ธ์ฆ ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์น์ง ์์์์ ๊ฑฐ์ ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ RGB ๊ตฌ์กฐ(์ด๋ฏธ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ฐฉ๊ธ ๋ณด๋๋ค๋ฉด ์ง์นจ์ ์์ ํ ์ค์ํ ๊ฒ์
๋๋ค.
์ด์ ์ ๋งํ๋ฏ์ด ์ด๋ฌํ ๊ธฐ์กด ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ API ํ๋ฉด์ ๋ฐ์ ์์ผฐ๊ณ ์ฌ๋ฌ ์๋๋ฆฌ์ค์์ ์ ํฌ ํ ์คํธ๋ฅผ ๊ฑฐ์ณค์ต๋๋ค. ์ด ๊ธด ์ค๋ ๋์์ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฌ ๊ฒ ์ด์์ ๋๋ค. ๋ค์ ํ ๋ฒ ๋์ ํฌํ๋ ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ๋ ค๊ณ ์๋ํ๊ธฐ๋ณด๋ค ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ชจ๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ๋ชจ๋ ์ค์น์์ ํด๋น ์ง์๊ณผ ๊ฒฝํ์ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ์ง ๋ง์ญ์์ค. ๋ก์ผ์ ๋ฐ๋ช ํ๋ ๋ฐ ์ฌ์ฉํ์ธ์ :)
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? @karelz ์ ์ํธํ ๋ก๋๋งต ์ค๋ ๋ ๋๋ AES GCM ์ค๋ ๋ ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๋ค.
๊ฐ์ฌ ํด์
์๋
๋ฐ๋ผ์ ๋ง์ง๋ง ๊ตฌ์ฒด์ ์ธ ์ ์์ https://github.com/dotnet/corefx/issues/23629#issuecomment -334328439์ ๋๋ค.
partial class AuthenticatedEncryptor
{
// throws if an operation is already in progress
public abstract void Initialize(ReadOnlySpan<byte> associatedData);
// true on success, false on โdestination too smallโ, exception on anything else.
public abstract bool TryEncrypt(ReadOnlySpan<byte> data, Span<byte> encryptedData, out int bytesRead, out int bytesWritten);
// false if remainingEncryptedData is too small, throws if other inputs are too small, see NonceOrIVSizeInBits and TagSizeInBits properties.
// NonceOrIvUsed could move to Initialize, but then it might be interpreted as an input.
public abstract bool TryFinish(ReadOnlySpan<byte> remainingData, Span<byte> remainingEncryptedData, out int bytesWritten, Span<byte> tag, Span<byte> nonceOrIvUsed);
}
partial class AuthenticatedDecryptor
{
// throws if an operation is already in progress
public abstract void Initialize(ReadOnlySpan<byte> tag, ReadOnlySpan<byte> nonceOrIv, ReadOnlySpan<byte> associatedData);
// true on success, false on โdestination too smallโ, exception on anything else.
public abstract bool TryDecrypt(ReadOnlySpan<byte> data, Span<byte> decryptedData, out int bytesRead, out int bytesWritten);
// throws on bad tag, but might leak the data anyways.
// (remainingDecryptedData is required for CBC+HMAC, and so may as well add remainingData, I guess?)
public abstract bool TryFinish(ReadOnlySpan<byte> remainingData, Span<byte> remainingDecryptedData, out int bytesWritten);
}
์ดํ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ง ์ ๊ธฐ๋์์ต๋๋ค.
INonceProvider
๋ ๋ถํ์ํ๊ฒ ๋ณต์กํ๊ฑฐ๋ NIST ๋ฐ FIPS ์ง์นจ์ ์ค์ํ์ง ์์ ์ ์์ต๋๋ค.๋ค์์ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
byte[]
-๋๋ฑํ ์ชฝ์ผ๋ก ๊ธฐ์ธ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฃผ์
๋ INonceProvider
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌํ ์ค์ํ์ด ๋ ์ํํด์ง๋๋ค. @sidshetye ์ ์๊ฒฌ์ ๋ฐ๋ฐํ ์ ์๊ฑฐ๋ ๋จ์ํ RNG๋ฅผ ํธ์ถํ๋ ๊ฐ๋จํ INonceProvider
๊ตฌํ์ด ์ฌ์ ํ ๊ท์ ์ ์ค์ํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๊น?INonceProvider
์์ IIVProvider
, nonceOrIv*
์์ iv*
$ ๋ก์ ์ด๋ฆ ๋ณ๊ฒฝ์ ์์ฒญํฉ๋๋ค. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ํญ์ IV๋ฅผ ๋ค๋ฃจ๊ณ ์์ง๋ง ๋ฐ๋์ nonce๋ฅผ ๋ค๋ฃฐ ํ์๋ ์์ต๋๋ค.ํ๊ทธ ์ ํ์ ๋ด ์๋๋ฆฌ์ค์ ์์์ด ์๋๋ฏ๋ก ์๋ง๋ ์์ฒด ๊ตฌํ์ ์ ์งํ ๊ฒ์ ๋๋ค. ๊ด์ฐฎ์ต๋๋ค. ์ด ์์ญ์์ ๋์ ์ฑ๋ฅ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ชจ๋ ์ฌ๋์ ์ฐจ ํ์์ ์ผ์ธ์ง ํ์ ํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ๋ถํ์ํ ๋๊ธฐ ์๊ฐ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ๋ ์ ๋์ฝ๋ฉ์ ์์ํ๋ ค๋ฉด ๋์ ํ๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด ์ ์ฒด ๋ฉ์์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ฒํผ๋งํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก IO์ ์ํธ ํด๋ ์ ๊ฒน์น ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ง์ง๋ง์ ํ์ฉํ๋ ๊ฒ์ด ์ ๊ทธ๋ ๊ฒ ์ด๋ ค์ด์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด API์ ๋ํ ์ฅ์ ๋ฌผ์ ๋ฒ์ด๋์ง ์์ ๊ฒ์ ๋๋ค. ๋ด ์๋๋ฆฌ์ค์์๋ ๊ด์ฌ์ด ์์ ๊ฒ์ ๋๋ค.
IV๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด์ด๊ณ nonce๋ IV์ ํน์ ์ข ๋ฅ์ ๋๋ค. ๋ง์ต๋๊น?
์๋์. nonce
๋ ํ ๋ฒ ์ฌ์ฉ๋๋ ์ซ์์
๋๋ค. nonce๋ฅผ ์ง์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฌ์ฉ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์ฅ์ ์๋ฐํจ์ ๋ํ๋
๋๋ค. GCM์ ๊ฒฝ์ฐ ๋์ผํ ํค์ ๋ค๋ฅธ ๋ฉ์์ง๋ก ๋์ผํ ๋
ผ์ค๋ฅผ ์ฌ์ฉํ๋ฉด GHASH ํค๊ฐ ์์๋์ด GCM์ CTR๋ก ์ค์ผ ์ ์์ต๋๋ค.
http://nvlpubs.nist.gov/nistpubs/ir/2013/NIST.IR.7298r2.pdf ์์:
Nonce: ๋์ผํ ํค๋ก ์ ๋ ๋ฐ๋ณต๋์ง ์๋ ๋ณด์ ํ๋กํ ์ฝ์์ ์ฌ์ฉ๋๋ ๊ฐ. ์๋ฅผ ๋ค์ด, ์ฑ๋ฆฐ์ง-์๋ต ์ธ์ฆ ํ๋กํ ์ฝ์์ ์ฑ๋ฆฐ์ง๋ก ์ฌ์ฉ๋๋ nonce๋ ์ผ๋ฐ์ ์ผ๋ก ์ธ์ฆ ํค๊ฐ ๋ณ๊ฒฝ๋ ๋๊น์ง ๋ฐ๋ณต๋์ด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ ๊ณต๊ฒฉ์ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. nonce๋ฅผ ์ฑ๋ฆฐ์ง๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์์ ์ฑ๋ฆฐ์ง์ ๋ค๋ฅธ ์๊ตฌ ์ฌํญ์ ๋๋ค. ์๋ํ๋ฉด nonce๊ฐ ๋ฐ๋์ ์์ธกํ ์ ์๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
"IV"์๋ ๋์ผํ ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, CBC๋ฅผ ์ฌ์ฉํ์ฌ IV๋ฅผ ๋ฐ๋ณตํ๋ฉด ์ํธํ๋ ๋ฉ์์ง๊ฐ ๋์ผํ IV๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฉ์์ง์ ๊ฐ๊ฑฐ๋ ๋ค๋ฅธ์ง ์ฌ๋ถ๋ง ๋์ถ๋ฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ์ฝํ์ํค์ง ์์ต๋๋ค.
nonce๋ ํ ๋ฒ ์ฌ์ฉ๋๋ ์ซ์์ ๋๋ค.
"IV"์๋ ๋์ผํ ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค.
@bartonjs ๋ค. nonce๊ฐ ์ํธ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ด๊ธฐํ ํ๋ ๋ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ ๋ฒกํฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ์ฐพ์ ์ ์๋ IV์ ์ ์์ ์๋ฒฝํ๊ฒ ๋ถํฉํฉ๋๋ค. ์๊ฐ ๋๋ ๊ฒ์ด ๋๋ฌผ์ด ๋๋ ๊ฒ๋ณด๋ค ๋ ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ด ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ์๊ฒฉํ ์๊ตฌ ์ฌํญ์ด ์์ต๋๋ค. ํ์ฌ ๋ฌธ๊ตฌ๋ "cowOrAnimal" ๋งค๊ฐ๋ณ์๋ฅผ ์๊ตฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋๋ง๋ค IV์ ์๊ตฌ ์ฌํญ์ด ๋ค๋ฅด๋ค๋ ์ฌ์ค์ ๋ชจ๋ ์ด๋ค ํํ์ IV๋ฅผ ์๊ตฌํ๋ค๋ ์ฌ์ค์ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์ ๊ฐ ๋์น๊ณ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ํ์ฌ์ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ "iv" ๋๋ "IIVProvider"๋ง ๊ฐ๋จํ๊ณ ์ ํํฉ๋๋ค.
nonceOrIv
์์ ๊ฑฐ ๋ณด๊ด์์ ํ๋ํ๋ ค๋ฉด:
96๋นํธ GCM IV๋ ๋๋๋ก 4๋ฐ์ดํธ salt
๋ฐ 8๋ฐ์ดํธ nonce
๋ก ์ ์๋ฉ๋๋ค(์: RFC 5288). RFC 4106์ GCM nonce
๋ฅผ 4๋ฐ์ดํธ salt
๋ฐ 8๋ฐ์ดํธ iv
์ ์ํฉ๋๋ค. RFC 5084(CMS์ GCM)์ ๋ฐ๋ฅด๋ฉด CCM์ nonce
, GCM ์ iv
, ๊ทธ๋ฌ๋ _"... AES-CCM ๋ฐ AES-GCM์ ๋ํ ๊ณตํต ์ฉ์ด ์งํฉ์ ๊ฐ์ต๋๋ค. , AES-GCM IV๋ ์ด ๋ฌธ์์ ๋๋จธ์ง ๋ถ๋ถ์์ nonce๋ผ๊ณ ํฉ๋๋ค."_ RFC 5647(SSH์ฉ GCM)์ _"์ฐธ๊ณ : [RFC5116]์์ IV๋ nonce๋ผ๊ณ ํฉ๋๋ค."_ RFC 4543( IPSec์ GCM)์ _"ํจํท์ IV ํ๋์ ๊ตฌ๋ณํ๊ธฐ ์ํด AES-GMAC IV ์
๋ ฅ์ nonce๋ก ์ฐธ์กฐํฉ๋๋ค."๋ผ๊ณ ๋งํฉ๋๋ค. RFC 7714(SRTP์ฉ GCM)๋ 12๋ฐ์ดํธ IV
์ด๊ณ ๊ฑฐ์ ์ผ๊ด์ฑ์ ์ ์งํ์ง๋ง "_์ต์ ๋ฐ ์ต๋ ๋
ผ์ค(IV) ๊ธธ์ด: 12 ์ฅํ
์ด์ด์ผ ํฉ๋๋ค."_
๋๋ถ๋ถ์ GCM ์ฌ์์์ ์ผ๊ด์ฑ์ด ์์ ํ ๊ฒฐ์ฌ๋์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ nonceOrIv
๋ ๋ค์ ์๋ฏธ๊ฐ ์์ต๋๋ค. $0.02
์ฌ๊ธฐ์์ ์์ ์ ํ๋ช ํ๋ ๋ค๋ฅธ ๊ณ ๊ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์๊ตฌํ๋ ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ๋ ์ฝ์ง ์์ ์ผ์ ๋๋ค. .NET์ด ์ด ์ธ์์ ์ผ๋ก ๋์ ๋ ์ ํ์ผ๋ก ๋์ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ํ์ฅ์ฑ์ ์์ ํ ์ฃฝ์ ๋๋ค.
๋ณต์ก์ฑ์ด ์ถ๊ฐ๋๋ค๋ ์ฃผ์ฅ์ ๋ท๋ฐ์นจํ ์ ์์ต๋๊น? ์ค์ ๋ก๋ ์ฌ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ ํ๋ซํผ๋ณ ์ํธํ ๊ตฌํ(๋ํํ )์๋ ์ด๋ฌํ ์ ํ์ด ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ๊ทธ ์ด์ ๋ ์
๋ ฅ ํ๊ทธ๊ฐ ๊ณ์ฐ๋ ํ๊ทธ์ ๋นํด ๋จ์ํ ์ผ์ ์๊ฐ์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ์ฐ๋ ํ๊ทธ๋ TryFinish
๋์ ์ต์ข
๋ธ๋ก์ด ํด๋
๋ ํ์ ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ณธ์ง์ ์ผ๋ก ๊ตฌํ์ ์์ํ ๋ TryFinish
๊น์ง ์ธ์คํด์ค ๋ด๋ถ์ tag
๋ฅผ ์ ์ฅํ๊ณ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค. ์ ํ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
public abstract bool TryFinish(ReadOnlySpan<byte> remainingData,
Span<byte> remainingDecryptedData,
out int bytesWritten,
ReadOnlySpan<byte> tag = null); // <==
๋๋ ๋ํ ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ์ํธํ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃฐ ๋จ์ผ ์ธํฐํ์ด์ค๋ก ์ ๊ทํํ๊ธฐ ์ํด ๋๋ฌด ์ด์ฌํ ๋ ธ๋ ฅํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ผ๋ฐํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ํธํ์ง๋ง ๊ธฐ๋ฅ์ด๋ ํ์ฅ์ฑ์ ํฌ์ํ ์ ์ ์์ต๋๋ค. ํนํ ์ธ์ด ์์ฒด์ ํ์ค ํฌ๋ฆฝํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ณธ ๊ณ์ธต์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. IMHO, ๊ทธ๋ ๊ฒ ํ๋ ์์ ์ ๋ฐ๊ฒฌํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ์ถ์ํ์ ๊ฒฐํจ์ด ์์์ ์๋ฏธํฉ๋๋ค.
๋จ์ํ๊ณ ์ผ๊ด๋ ์ธํฐํ์ด์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด์ ์ ์ฌ๊ธฐ์์ ์ต์ 1๋ก ์ ๊ธฐ ๋ Java ์ ๊ทผ ๋ฐฉ์์ ์ ํธํฉ๋๋ค . ๋ํ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋ด์์ ํ๊ทธ๋ฅผ ๋จผ์ /๋ง์ง๋ง์ผ๋ก ํ๊ทธ๋ฅผ ์ง์ ํ๋ ์์ ๋ฌธ์ ๋ฅผ ํํผํฉ๋๋ค(IMHO, ๊ทธ๋์ผ ํ๋ค๊ณ ์๊ฐํจ). ์ฐ๋ฆฌ ํ์ ์ด๊ฒ์ ๊ตฌํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ์ ๊ฒฐ์ ์ ์๋์ง๋ง ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ณ ๊ตฌํ์ ์์ํด์ผ ํ๋ค๋ฉด ์ด ๊ธธ์ ํ์คํ ๊ฐ ๊ฒ์ ๋๋ค.
INonce
์ธํฐํ์ด์ค๋ฅผ ํผํ์ญ์์ค. ๊ฐ๋จํ byte[]
๋๋ span<>
๋ ํธํ๋๋ ๋ก์ฐ ๋ ๋ฒจ ์ธํฐํ์ด์ค์ ์ถฉ๋ถํด์ผ ํฉ๋๋ค.
IV ๋ Nonce - ์ผ๋ฐํ๋ ๊ฒฝ์ฐ๋ ์ค์ ๋ก IV์ ๋๋ค. GCM์ ๊ฒฝ์ฐ IV๋ Nonce์ฌ์ผ ํฉ๋๋ค(์: Car vs RedOrCar). ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ์ ๋ @timovzl ์ด ๋งค์ฐ ์ ์ฌํ ์์ ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. :)
@sidshetye (1) ํ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ํ์๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๊ณ (2) ๋ค๋ฅธ ๋ชจ๋ ์ํฉ์์ TryFinish
๋งํผ ๋ฆ๊ฒ ํ๊ทธ๋ง ํ์ํ๋ค๋ ์ ํํ ์ ์์ ํ ์ ์์ต๋๊น?
๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ์๊ฐํ๊ณ ์๋ ๊ฒ ๊ฐ์๋ฐ์?
Initialize
์ ํ๊ทธ๋ null์ด ํ์ฉ๋ฉ๋๋ค. ์ฌ์ ์ ์ด๋ฅผ ํ์๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ๋ง null์ ๋ฐ์์ํต๋๋ค.TryFinish
์ ํ๊ทธ๋ ํ์์ด๊ฑฐ๋ (๋๋) ์ฌ์ ์ ์ด๋ฏธ ์๊ตฌํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด null์ด ํ์ฉ๋ฉ๋๋ค.์์ ๋ด์ฉ์ ๋ฌธ์ํ ๋ฐ ๋ ธํ์ฐ์ ํํ๋ก ๋ณต์ก์ฑ์ ์ถ๊ฐํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ ์์ค API์ ๊ฒฝ์ฐ ์ ์ ํ ๋ฌธ์์ ๋ ธํ์ฐ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์์ ํฌ์์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๊ตฌํ ๋ฐ ์คํธ๋ฆฌ๋ฐ๊ณผ์ ํธํ์ฑ์ ์ํด ์ด๊ฒ์ด ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ํ์ ํ๊ธฐ ์์ํ์ต๋๋ค.
@timovzl ๋ฌผ๋ก ์ ๋๋ค. ๋ด์ผ ์๊ฐ์ ๋ผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@Timovzl , ๋๋ ์ค๋์์์ผ ์๊ฐ์ ๋ด๊ณ ๊ฒฐ๊ตญ ํ ๋ผ๊ตด์ด ๋์์ต๋๋ค! ๊ธธ์ง๋ง ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์บก์ฒํ๊ณ .NET Core/Standard ๋ฐฉํฅ( Span<>
)์ ์์ฉํ๋ฉด์ .NET ์ํธํ์ ์ฅ์ ( ICryptoTransform
)์ ์บก์ฒํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ค์ ์ฝ์์ง๋ง ์๋์ ์คํ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ํ ์ผ๋ถ ์ค์๊ฐ ์ปค๋ฎค๋์ผ์ด์
(์ฑํ
, ํ์ ํตํ ๋ฑ)์ ์ ์ํ ๋ธ๋ ์ธ์คํ ๋ฐ์ ํ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ๊ณ ๋ คํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋จผ์ API ์ฌ์ฉ์๋ฅผ ์ํ ๊ฒฐ๊ณผ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
var aesGcm = new AesGcm();
using (var encryptor = aesGcm.CreateAuthenticatedEncryptor(Key, IV, AAD))
{
using (var cryptoOutStream = new CryptoStream(cipherOutStream, encryptor, CryptoStreamMode.Write))
{
clearInStream.CopyTo(cryptoOutStream);
}
}
var aesGcm = new AesGcm();
using (var decryptor = aesGcm.CreateAuthenticatedDecryptor(Key, IV, AAD))
{
using (var decryptStream = new CryptoStream(cipherInStream, encryptor, CryptoStreamMode.Write))
{
decryptStream.CopyTo(clearOutStream);
}
}
๋น ์คํธ๋ฆฌ๋ฐ์ ์คํธ๋ฆฌ๋ฐ์ ํน๋ณํ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์์ ์ฌ์ฉ์ ์ฝ๋๋ฅผ AuthenticatedSymmetricAlgorithm
(์๋ ์ ์)์ ๋์ฐ๋ฏธ ๋ฉ์๋๋ก ๋ํํ์ฌ ๋ ๊ฐ๋จํ API๋ฅผ ๋
ธ์ถํ ์ ์์ต๋๋ค. ์ฆ
public class AesGcm : AuthenticatedSymmetricAlgorithm
{
...
// These return only after consuming entire input buffer
// Code like Streaming Encrypt from above within here
โ public abstract bool TryEncrypt(ReadOnlySpan<byte> clearData, Span<byte> encryptedData);
// Code like Streaming Decrypt from above within here
public abstract bool TryDecrypt(ReadOnlySpan<byte> encryptedData, Span<byte> clearData);
...
}
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ๋จํ API๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ผ๋ก ๋ ๋ฐฐ๊ฐ ๋ ์ ์์ต๋๋ค.
var aesGcm = new AesGcm(Key, IV, AAD);
aesGcm.TryEncrypt(clearData, encryptedData);
var tag = aesGcm.Tag;
var aesGcm = new AesGcm(Key, IV, AAD);
aesGcm.Tag = tag;
aesGcm.TryDecrypt(encryptedData, clearData);
corefx ์์ค๋ฅผ ๋ณด๋ฉด Span<>์ ์ด๋์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ System.Security.Cryptography.*๊ฐ ํฌํจ๋ฉ๋๋ค. - ๋์นญ ์ํธ๋ ์์ธ์ด๋ฏ๋ก ์ฒซ ๋ฒ์งธ ๋ฐ ์ต์์ ๊ณ์ธต ์ธ์ฆ ์ํธํ๋ฅผ ์์ ํฉ๋๋ค.
ICipherTransform
์์ฑ์ด๊ฒ์ ICryptoTransform
์ Span ์ธ์ ๋ฒ์ ๊ณผ ๊ฐ์ต๋๋ค. ๋๋ ํ๋ ์์ํฌ ์
๊ทธ๋ ์ด๋์ ์ผ๋ถ๋ก ์ธํฐํ์ด์ค ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ํด ๋ฏผ๊ฐํ ์ ์์ผ๋ฏ๋ก ICipherTransform
๋ผ๊ณ ํฉ๋๋ค.
public partial interface ICipherTransform : System.IDisposable
{
bool CanReuseTransform { get; }
bool CanTransformMultipleBlocks { get; } // multiple blocks in single call?
bool CanChainBlocks { get; } // multiple blocks across Transform/TransformFinal
int InputBlockSize { get; }
int OutputBlockSize { get; }
int TransformBlock(ReadOnlySpan<byte> inputBuffer, int inputOffset, int inputCount, Span<byte> outputBuffer, int outputOffset);
Span<byte> TransformFinalBlock(ReadOnlySpan<byte> inputBuffer, int inputOffset, int inputCount);
}
ICryptoTransform
๋ [Obsolete]
๋ก ํ์.NET ์ํธํ์ ๋ํ ์ฌ์ ์ง์์ด ์๋ ์ฌ๋๋ค์๊ฒ ์์๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด
[Obsolete("See ICipherTransform")]
public partial interface ICryptoTransform : System.IDisposable { ... }
SymmetricAlgorithm
ํด๋์ค ํ์ฅpublic abstract class SymmetricAlgorithm : IDisposable
{
...
public abstract ICipherTransform CreateDecryptor(ReadOnlySpan<byte> Key, ReadOnlySpan<byte> IV);
public abstract ICipherTransform CreateEncryptor(ReadOnlySpan<byte> Key, ReadOnlySpan<byte> IV);
public virtual ReadOnlySpan<byte> KeySpan {...}
public virtual ReadOnlySpan<byte> IVSpan {...}
public virtual ReadOnlySpan<byte> KeySpan {...}
...
}
CryptoStream
ํ์ฅ์ด๊ฒ์ System.Runtime์ Stream
์ ๊ฐ์ต๋๋ค. ๋ํ AEAD ์ฌ๋ก์ ๋ฐ๋ผ ๋๋ฆฌ์ธ์ ์ถ๊ฐํ ์์ ์
๋๋ค.
์ค์: CryptoStream
๋ ์ํธํ ์ค์ ์คํธ๋ฆผ ๋์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ ์ํธ ํด๋
์ค์ ํ๊ทธ(TagSize ๋ฐ์ดํธ)๋ฅผ ์๋์ผ๋ก ์ถ์ถํ๋ ค๋ฉด FlushFinalBlock
์์ ํ์ ์
๊ทธ๋ ์ด๋๊ฐ ํ์ํฉ๋๋ค . ์ด๊ฒ์ Java์ ์ํธํ ์ํคํ
์ฒ ๋๋ C# BouncyCastle๊ณผ ๊ฐ์ ์ ํฌ ํ
์คํธ๋ฅผ ๊ฑฐ์น ๋ค๋ฅธ API์ ์ ์ฌํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ์์ ํ๊ทธ๊ฐ ๋์ ์์ฑ๋์ง๋ง ์ํธ ํด๋
์ค์ ์ต์ข
๋ธ๋ก์ด ๋ณํ๋ ๋๊น์ง ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ถ๊ฐํผํ์ง๋ง ๊ฐ์ฅ ์ข์ ์์น์
๋๋ค. ์ฅ์ ์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ํฌ๊ฒ ๋จ์ํํ๋ค๋ ๊ฒ์
๋๋ค.
์ฐธ๊ณ : 1) CBC-HMAC๋ฅผ ์ฌ์ฉํ๋ฉด ๋จผ์ ํ๊ทธ๋ฅผ ํ์ธํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. ๋ ์์ ํ ์ต์ ์ด์ง๋ง ๊ทธ๋ ๋ค๋ฉด ์ค์ ๋ก๋ 2๋จ๊ณ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํจ์ค๋ HMAC ํ๊ทธ๋ฅผ ๊ณ์ฐํ๊ณ ๋ ๋ฒ์งธ ํจ์ค๋ ์ค์ ๋ก ์ํธ ํด๋ ์ ์ํํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์คํธ๋ฆผ ๋๋ ๋คํธ์ํฌ ์คํธ๋ฆผ์ ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒํผ๋ง๋์ด ์์ท ๋ชจ๋ธ๋ก ์ถ์๋์ด์ผ ํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐํ์ง ์์ต๋๋ค. GCM ๋๋ CCM๊ณผ ๊ฐ์ ์ง์ ํ AEAD ์๊ณ ๋ฆฌ์ฆ์ ํจ์จ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ ์ ์์ต๋๋ค.
public class CryptoStream : Stream, IDisposable
{
...
public CryptoStream(Stream stream, IAuthenticatedCipherTransform transform, CryptoStreamMode mode);
public override int Read(Span<byte> buffer, int offset, int count);
public override Task<int> ReadAsync(Span<byte> buffer, int offset, int count, CancellationToken cancellationToken);
public override void Write(ReadOnlySpan<byte> buffer, int offset, int count);
public override Task WriteAsync(ReadOnlySpan<byte> buffer, int offset, int count, CancellationToken cancellationToken);
public void FlushFinalBlock()
{
...
// If IAuthenticatedCipherTransform
// If encrypting, `TransformFinalBlock` -> `GetTag` -> append to out stream
// If decryption, extract last `TagSize` bytes -> `SetExpectedTag` -> `TransformFinalBlock`
...
}
...
}
์์ ๊ฐ์ด AEAD(Authenticated Encryption with Associated Data)๋ฅผ ํ์ฉํ๊ธฐ ์ํด ๋๋ฝ๋ ๋นํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ICipherTransform
์ฐ์ฅ์ด๋ ๊ฒ ํ๋ฉด CryptoStream
์ด ์์
์ ์ ๋๋ก ์ํํ ์ ์์ต๋๋ค. ๋ํ IAuthenticatedCipherTransform
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด ์ฌ์ฉ์ ์ ์ ์คํธ๋ฆฌ๋ฐ ํด๋์ค/์ฌ์ฉ๋ฒ์ ๊ตฌํํ ์ ์์ง๋ง CryptoStream
๋ก ์์
ํ๋ฉด ๋งค์ฐ ์์ง๋ ฅ ์๊ณ ์ผ๊ด๋ .net ์ํธํ API๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
public interface IAuthenticatedCipherTransform : ICipherTransform
{
Span<byte> GetTag();
void SetExpectedTag(Span<byte> tag);
}
๋จ์ํ ํ์ฅ SymmetricAlgorithm
public abstract class AuthenticatedSymmetricAlgorithm : SymmetricAlgorithm
{
...
// Program Key/IV/AAD via class properties OR CreateAuthenticatedEn/Decryptor() params
public abstract IAuthenticatedCipherTransform CreateAuthenticatedDecryptor(ReadOnlySpan<byte> Key = default, ReadOnlySpan<byte> IV = default, ReadOnlySpan<byte> AuthenticatedData = default);
public abstract IAuthenticatedCipherTransform CreateAuthenticatedEncryptor(ReadOnlySpan<byte> Key = default, ReadOnlySpan<byte> IV = default, ReadOnlySpan<byte> AuthenticatedData = default);
public virtual Span<byte> AuthenticatedData {...}
public virtual Span<byte> Tag {...}
public virtual int TagSize {...}
...
}
public class AesGcm : AuthenticatedSymmetricAlgorithm
{
public AesGcm(ReadOnlySpan<byte> Key = default, ReadOnlySpan<byte> IV = default, ReadOnlySpan<byte> AuthenticatedData = default)
/* other stuff like valid key sizes etc similar to `System.Security.Cryptography.Aes` */
}
@sidshetye ๋ ธ๋ ฅ์ ๋ฐ์๋ฅผ ๋ณด๋ ๋๋ค.
GCM์ ํตํ ์คํธ๋ฆฌ๋ฐ ์ํธํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. GCM์ ํตํ ์คํธ๋ฆฌ๋ฐ ๋ณตํธํ๋
์ด ์ค๋ ๋์ ์๋ถ๋ถ์์ ๋น๋์นญ Encrypt/Decrypt API์ ๊ฐ๋ฅ์ฑ์ด (๊ฐ๋ ์ ์ผ๋ก) ์ ๊ธฐ๋์์ผ๋ฉฐ, ์ ๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ๋์ ์๊ฐ์ด ๋ ๊ฒ์ด๋ผ๋ ํฉ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ฝํ๋ฉด, GCM ๋ณตํธํ๋ฅผ ์ํ ๋์ ์์ค์ ๋ฐ์ดํธ ์ธ๋ถํ๋ ์คํธ๋ฆฌ๋ฐ API๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค . ์ ์๋ ์ฌ๋ฌ ๋ฒ ๋งํ๊ณ , ๋ค์ ๋งํด์. ์คํธ๋ฆฌ๋ฐ API๋ฅผ ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ฒญํฌ ์ํธํ์ ๋๋ค. ์ฒญํฌ ์ํธํ์ ๋ํ ๋ชจ๋ ์ฌ๋์ ํ์ ๋ชฉ๋ง๋ฅผ ์ ์ฝํ๊ฒ ์ต๋๋ค.
MS๊ฐ GCM API์ ๋ํด ๋ฌด์์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ RUP๋ ํ์ฉ๋ ์ ์์ต๋๋ค.
@sdrapkin RUP๋ ์ฌ๊ธฐ ์์ ์์ธํ ๋ ผ์๋์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ทธ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋์ต๋๋ค. ๊ฐ๋จํ ๋งํด์, RUP๋ ๋ณตํธํ๋ ๋ฐ์ดํฐ๊ฐ ํ๊ทธ๊ฐ ํ์ธ๋ ๋๊น์ง ์ฌ์ฉ๋ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ง Java JCE, WinNT bcrypt, OpenSSL ๋ฑ๊ณผ ๊ฐ์ด ๋ฉ์๋ ๊ฒฝ๊ณ์์ ์ํํ ํ์๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ํธํ ๊ธฐ๋ณธ ์์, ํนํ ๋ฎ์ ์์ค์ ๊ธฐ๋ณธ ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฃผ์ํด์ ์ฌ์ฉํ์ญ์์ค.
^^ ๋๋ฌด. ๋๋ ๋ ๋์ ์์ค์ ์คํธ๋ฆผ API ๋ฑ์ ๋์ํ๊ณ ๊ทธ๊ฒ์ ์ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ถํ ๋ฒํผ ๋ฑ๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ฉฐ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋์ง ์๋๋ก ํ๋ ๊ฒ์ ๋์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ํ๊ทธ ๊ณ์ฐ/์ฒดํฌ ํฌ์ธํธ์์ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋ฎ์ ์์ค์ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ์คํธ๋งํ์ง ๋ง์ญ์์ค.
๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ๋์ง ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
์๋ชป๋. ๊ทธ๊ฒ์ ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ง ์์ต๋๋ค. AES-GCM์ ๋งค์ฐ _ํน์ ํ_ ์ ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ทธ ์ ์๋ ๊ทธ๊ฒ์ด ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค. ์ํ๋ ๊ฒ์ ๋ณ๋์ AES-CTR ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ณ๋์ GHASH ํ๋ฆฌ๋ฏธํฐ๋ธ๋ก, ์ํ๋ ๋๋ก ๊ฒฐํฉํ๊ณ ์ ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋ณ๋์ AES-CTR ๋ฐ GHASH ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๋ํด ๋ ผ์ํ๊ณ ์์ง ์์ต๋๊น? ์ฐ๋ฆฌ๋ AES-GCM์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ AES-GCM ์ RUP๊ฐ ํ์ฉ๋์ง ์๋๋ก ์๊ตฌํฉ๋๋ค.
๋ํ crypto.stackexchange ์์ Ilmari Karonen ์ ๋ต๋ณ์ ๊ฒํ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@sdrapkin ๋น์ ์ ์ข์ ์ง์ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ์๋ RUP์์ ์์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๊ณ ์ฌ๊ธฐ์์ ๊ฒฐ์ ๋ API์ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ด ์ ํฉํ๋๋ก ํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ค์์ ์ ํํด์ผ ํฉ๋๋ค.
์คํธ๋ฆฌ๋ฐ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ์งํ๊ณ ์ด ์ฌ์ฉ๋ฒ์ด ์๋ชป๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ์์ธ๋ฅผ throwํ ์ ์์ต๋๊น? ์๋๋ฉด ์คํธ๋ฆฌ๋ฐ ๊ตฌํ์ด ์ ์ฒด ๋ฒํผ๋ฅผ ์ฌ์ฉํ๋๋ก ํด์ผ ํฉ๋๊น? ํ์๋ ๋ถํํ ๊ฒ์ ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์ค์ด๋ผ๊ณ ์๊ฐํ ์๋ ์์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ ๊ตฌํ์์ ํ์ธํ๋ SupportsStreaming(out string whyNot)
๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐ/์ต์ข ํ๊ทธ์ ๋ํ ํ๊ณ ํ ์ฃผ์ฅ์ด ์์ต๋๊น? ๊ทธ๋ ์ง ์๋ค๋ฉด API๋ก ์ด๋ฅผ ๋ฐฐ์ ํ์ง ์๋ ๊ฒ์ ๋ชฉํ๋ก ์ผ์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@sdrapkin : ์ด๊ฒ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ RUP๋ฅผ ๋ ๋๊ฒ ๋ณผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ๊ฒ์ฆ๋์ง ์์ ๋ฐ์ดํฐ์ ์ค์ ๋ฆด๋ฆฌ์ค/์ฌ์ฉ๋ณด๋ค ๋ฒํผ๋ง ๋ฐ ๋ ์ด์ด ์ค๊ณ ๋ฌธ์ ์ ๊ฐ๊น์ต๋๋ค. AES GCM์ ๋ํ NIST ํน๋ณ ๊ฐํ๋ฌผ 800-38D๋ฅผ ๋ณด๋ฉด
GCM ์ฌ์์ ์ต๋ ์ผ๋ฐ ํ ์คํธ ๊ธธ์ด๋ฅผ 2^39-256๋นํธ ~ 64GB๋ก ์ ์ํฉ๋๋ค. ์์คํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๊น์ด ๊ณณ์์ ๋ฒํผ๋งํ๋ ๊ฒ์ ๋นํฉ๋ฆฌ์ ์ ๋๋ค.
GCM ์ฌ์์ ํ๊ทธ๊ฐ ์คํจํ๋ฉด ์ถ๋ ฅ์ FAIL๋ก ์ ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌํ์ ์ด๋ค ๋ ์ด์ด๊ฐ ํ๊ทธ ํ์ธ๊น์ง ๋ฒํผ๋งํด์ผ ํ๋์ง์ ๋ํ ๊ท์ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ํธ์ถ ์คํ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
A => AESGCM_Decrypt_App(key, iv, ciphertext, aad, tag)
B => +- AESGCM_Decrypt_DotNet(key, iv, ciphertext, aad, tag)
C => +- AESGCM_Decrypt_OpenSSL(key, iv, ciphertext, aad, tag)
์ด๋์
A๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต์์ AES GCM์
๋๋ค.
B๋ ์ธ์ด ๊ณ์ธต์์ AES-GCM์
๋๋ค.
C๋ ํ๋ซํผ ๊ณ์ธต์์ AES-GCM์
๋๋ค.
ํ๊ทธ๊ฐ ์ฒดํฌ์์๋๋ฉด ์ผ๋ฐ ํ ์คํธ๊ฐ (A)์์ ํด์ ๋์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด FAIL์ด ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์์ ์ด๋์๋ ์ฃผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์งํ ์ค์ธ ์ผ๋ฐ ํ ์คํธ๋ฅผ ๋ฒํผ๋งํ ์ ์๋ ์ ์ผํ ์ฅ์์ด๋ฉฐ ๋ฒํผ๋ง์ด (B) ๋๋ (C) ๋๋ ๋ค๋ฅธ ๊ณณ์์ ๋ฐ์ํด์ผ ํ๋ค๊ณ ์ ์ํ์ง ์์ต๋๋ค. ์ค์ ๋ก OpenSSL, Windows NT Bcrypt(C)์ ์์์๋ ์คํธ๋ฆฌ๋ฐ์ด ์์ ๊ณ์ธต์์ ๋ฒํผ๋ง์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Java JCA, Microsoft์ CLR Security ๋ฐ ์์ ๋ด ์ ์์ ์คํธ๋ฆฌ๋ฐ์ด ์์ฉ ํ๋ก๊ทธ๋จ ๊ณ์ธต์์ ๋ฒํผ๋ง์ ํ์ฉํ๋ (B)์ ์์ ๋๋ค. A์ ์ค๊ณ์๊ฐ ์ผ๋ฐ ํ ์คํธ๋ฅผ ๋ฆด๋ฆฌ์คํ๊ธฐ ์ ์ ๋ ๋์ ๋ฒํผ๋ง ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ง ์๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ์ฃผ์ ๋์ ์ผ์ ๋๋ค. ์ด๋ก ์ ๋ฐ ์ค์ ๋ก ํด๋น ๋ฒํผ๋ ๋ฉ๋ชจ๋ฆฌ, SSD ๋๋ ๋คํธ์ํฌ์ ์คํ ๋ฆฌ์ง ํด๋ฌ์คํฐ๊ฐ ๋ ์ ์์ต๋๋ค. ๋๋ ํ์น ์นด๋ ;) !
๋ฒํผ๋ง์ ์ ์ณ๋๊ณ ๋ ์ด ๋ฐฑ์๋ ํค ์ ์ ๋ ๋๋ ์ ๋ ฅ ๋ฌด๊ธฐํ ์ค๋ฅ์ ๋ํ IV ๋น๋ฐ๋ณต๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ค์ ๋ฌธ์ (์น์ 9.1, ์ค๊ณ ๊ณ ๋ ค ์ฌํญ ๋ฐ 9.2, ์๋ ๊ณ ๋ ค ์ฌํญ ์ฐธ์กฐ)์ ๋ํด ๋ ผ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ถ๋ช ํ ์ด๊ฒ์ ๋ ์ด์ด B, ์ฆ ์ฌ๊ธฐ์์ ๊ตฝ์ง ์์ ๊ฒ์ ๋๋ค.
@timovzl ์์ ์ต๊ทผ ์ ์ ์ ์์ท(๊ฑด์ถ๊ฐ๋ ๋ฒํผ๋ง์ ์ ๊ฒฝ ์ฐ์ง ์์)๊ณผ ์คํธ๋ฆฌ๋ฐ(๊ฑด์ถ๊ฐ๋ ๋ ๋์ ๋ฒํผ๋ง ๊ธฐ๋ฅ์ ๊ฐ์ง)์ ๋ ๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ๋ชจ๋ ๋ค๋ฃน๋๋ค. ์ ์์ค ์คํธ๋ฆฌ๋ฐ API ๋ฌธ์ ๊ฐ ์ด์ ์๋น์๊ฐ ๋ฒํผ๋ง์ ๋ด๋นํ๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ๋ค๋ฉด ๋ณด์ ์ฆ๊ฑฐ์ ๊ฐ์๊ฐ ์๊ณ ์ฌ์์์ ๋ฒ์ด๋๋ ์ผ๋ ์์ต๋๋ค.
ํธ์ง: ๋ฌธ๋ฒ, ์คํ ๋ฐ ๋งํฌ๋ค์ด ์๋ ์๋
Bingo .. ์ฌ๊ธฐ์๋ ํ๊ทธ ํ์ธ์ด ๋ฐ์ํ๋ ์์น๋ ๋ ์ด์ด ๋์์ด๋์ ๊ฒฐ์ ์ ๋๋ค. ์ ๋ ๊ฒ์ฆ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ ๊ณต๊ฐํ๋ ๊ฒ์ ์นํธํ๋ ๊ฒ์ด ์๋๋๋ค.
๋ ผ์๋ ์ด๋ฌํ "์๋น์" ์์ค API์ธ์ง ์๋๋ฉด ์ง์ ํ Primitive์ธ์ง์ ๋ํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ์ง์ ํ ์์์ ์ด๋ผ๋ฉด ์์ ์์ค์ "๋ ์์ ํ" API๊ฐ ์์ ๊ตฌ์ถ๋ ์ ์๋๋ก ๊ธฐ๋ฅ์ ๋ ธ์ถํด์ผ ํฉ๋๋ค. ์์์ Nonce ํ ๋ก ์ ํตํด ์ด๊ฒ์ด ์ง์ ํ ์์์ ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ ์ด๋ฏธ ๊ฒฐ์ ๋์์ต๋๋ค. ์ฆ, ๋ฐ์ ์ด์ ์ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ/๋ถ๋ถ ์ํธ๋ฌธ ๋์ฝ๋ฉ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฆ, "๋ ๋์" ์์ค๊ณผ ๋ ์์ ํ API๋ฅผ ์ ์ํ๊ฒ ์ ๊ณตํ์ฌ ์ฌ๋๋ค์ด ์ด๋ค ์์ ์์ ์ ๊ฒ์ "๋กค๋ง"ํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ด ํ์์ ์ผ ๊ฒ์ ๋๋ค.
๋ด ๊ด์ฌ์ ๋คํธ์ํน/ํ์ดํ๋ผ์ธ์์ ๋น๋กฏ๋๋ฉฐ ๋ถ๋ถ ๋ฒํผ๋ฅผ ์ํํ ์ ์๊ณ "์์ท"์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ API์ ๋จ์ ์ ๋ํ ์ด์ ์ด ์์ผ๋ฏ๋ก ๊ณ์ BCrypt/OpenSsl ๋ฑ์ผ๋ก ์ง์ ์ด๋ํฉ๋๋ค.
๋ด ๊ด์ฌ์ ๋คํธ์ํน/ํ์ดํ๋ผ์ธ์์ ๋น๋กฏ๋๋ฉฐ ๋ถ๋ถ ๋ฒํผ๋ฅผ ์ํํ ์ ์๊ณ "์์ท"์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ API์ ๋จ์ ์ ๋ํ ์ด์ ์ด ์์ผ๋ฏ๋ก ๊ณ์ BCrypt/OpenSsl ๋ฑ์ผ๋ก ์ง์ ์ด๋ํฉ๋๋ค.
์ ํํ. ํ์์ฑ์ ์ฌ๋ผ์ง์ง ์์ ๊ฒ์ด๋ฏ๋ก ์ฌ๋๋ค์ ๋ค๋ฅธ ๊ตฌํ์ ์ฌ์ฉํ๊ฑฐ๋ ์์ฒด์ ์ผ๋ก ๊ตฌํํฉ๋๋ค. ์ข์ ๊ฒฝ๊ณ ๋ฌธ์๋ก ์คํธ๋ฆฌ๋ฐ์ ํ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฐ๋์ ์์ ํ ๊ฒฐ๊ณผ๋ ์๋๋๋ค.
@Timovzl , ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ง์ง๋ง ์ ์ ์ ๋ํด ๋ง์ ๊ธฐ์ ์ ํผ๋๋ฐฑ๊ณผ ๋์์ธ ์๊ตฌ ์ฌํญ์ ์ด๋์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌํ ๋ฐ ์ถ์์ ๋ํ ์๊ฐ์?
@Sidshetye ๋ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ๋ค๊ณ ์๊ฐ ํ๋ ์์ธํ ์ ์ ์ ํ์ต๋๋ค. RUP์ ๋ํ ๋จ์ผ ๋นํ์ ๋ ์ด์์ ๋ฐ๋ ์์ด ๋ค๋ฃจ์ด์ก์ต๋๋ค. (ํนํ, RUP๋ ์ฌ๋ฌ ๊ณ์ธต ์ค ํ๋์์ ๋ฐฉ์ง๋ ์ ์์ผ๋ฉฐ ์ ์์ค API๋ ์ด๋ ๊ณ์ธต์ ์ง์ํ์ง ์์์ผ ํ๋ฉฐ ์คํธ๋ฆฌ๋ฐ์ _no_ ์ ๊ณตํ๋ฉด ๋ ๋์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.)
์ง์ ์ ์ํด ์ต๊ทผ ์ ์์ ๋ํด ๋ ์ฐ๋ คํ๋ ์ฌ๋์ด ์์ผ๋ฉด ๋ง์ํด ์ฃผ์ญ์์ค. ๋ฌผ๋ก ๋์๋ ์ ์ํด ์ฃผ์ญ์์ค.
์ ๋ ์ด ์ ์๊ณผ API๊ฐ ๊ตฌ์ฒดํ๋๋ ๊ฒ์ ๋ํด ์ด๊ด์ ์ ๋๋ค.
@Sidshetye , ๋ช ๊ฐ์ง ์ง๋ฌธ๊ณผ ์ ์์ด ์์ต๋๋ค.
SymmetricAlgorithm
์์ ์์๋ฐ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๊น? ํตํฉํ๋ ค๋ ๊ธฐ์กด ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๊น? ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์ฅ์ ์ ๋์น๊ณ ์์ง ์๋ค๋ฉด ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์๋ AuthenticatedEncryptionAlgorithm
๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ๋ค๋ฅธ ๊ฒ์ด ์๋ค๋ฉด ๋ฐ๋์งํ์ง ์์ CreateEncryptor
/ CreateDecryptor
(์ธ์ฆ๋์ง ์์!) ๋ฉ์๋๊ฐ ๋
ธ์ถ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.SymmetricAlgorithm
๋ฅผ ๊ณ์ ์์ํ์ง ์๋ ํ AuthenticatedSymmetricAlgorithm
๋ ๊ธฐ์กด ์ฉ์ด์ธ ์ธ์ฆ๋ ์ํธํ๋ฅผ ์ค์ํ์ฌ AuthenticatedEncryptionAlgorithm
๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.TryEncrypt
/ TryDecrypt
๋ฅผ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ ๊ฐ๋ฅํ Tag
์์ฑ์ด ์๋ ๋์ ํ๊ทธ์ ์ฐ๊ฑฐ๋ ๋ฐ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค.key
, iv
๋ฐ authenticatedAdditionalData
๋ฅผ ์ค์ ํ๋ ๋ชฉ์ ์ ๋ฌด์์
๋๊น? ์ฌ๋ฌ ์ ํจํ ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ฐ๋ฅํ ํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์์ฑ์ ํผํฉ๋๋ค. ๊ทธ๊ฒ๋ค ์์ด ์
๋ฐ์ดํธ๋ ์ ์์ ๋ง๋ค ์ ์์ต๋๊น?AesGcm
์ ์ํ๋ฅผ ์ํฉ๋๊น? ๋ด ๋ณธ๋ฅ์ iv
๋ฐ authenticatedAdditionalData
๊ฐ ๋ฉ์์ง๋น์ด๋ฏ๋ก ํ์คํ ๋ฐฐ์ ํ๋ ๊ฒ์
๋๋ค. key
๋ ์ผ๋ฐ์ ์ผ๋ก ๋จ์ผ ํค๋ก ์ฌ๋ฌ ์์
์ ์ํํ๊ธฐ๋ฅผ ์ํ๋ฏ๋ก ์ํ๋ก ์ฌ์ฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํธ์ถ๋ณ๋ก ํค๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. CreateAuthenticatorEncryptor
์๋ ๋์ผํ ์ง๋ฌธ์ด ์ ์ฉ๋ฉ๋๋ค. ์ด์จ๋ ์ฐ๋ฆฌ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด _๋จ๋ฐฉํฅ_์ผ๋ก ์ ์ฐฉํด์ผ ํฉ๋๋ค. ์ฅ์ ๊ณผ ๋จ์ ์ ๋ํด ํ ๋ก ํ๊ณ ์ถ์ต๋๋ค. ์ ๋ AesGcm
์ ํค ์ํ์ ๊ธฐ๋๊ณ ์๊ณ ๋๋จธ์ง๋ ๊ฐ๊ฐ CreateAuthenticatedEncryptor
๋๋ TryEncrypt
์ ์์ต๋๋ค. ์ด๋ฏธ ๋์ํ๋ค๋ฉด ์
๋ฐ์ดํธ๋ ์ ์์ ๋ณด์ฌ์ฃผ์ธ์. :-)ICipherTransform
๋ ์ถ์ ํด๋์ค CipherTransform
์ฌ์ผ ๊ธฐ์กด ๊ตฌํ์ ์ค๋จํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.authenticatedData
๋๋ authenticatedAdditionalData
๋ผ๊ณ ํด์ผ ํฉ๋๊น? ๋ํ ๋งค๊ฐ๋ณ์ ์ด๋ฆ plaintext
๋ฐ ciphertext
๋ฅผ ์ ํํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.TryEncrypt
์ ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ciphertext
๋ฅผ ์ ๊ณตํ๋ ๋ฐ ํ์ํ ์คํฌ ๊ธธ์ด๋ฅผ ์ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ ๋ด๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค! TryDecrypt
๋ฐ plaintext
์ ๊ธธ์ด๋ ๋์ผํฉ๋๋ค. ํ์คํ ์ฐ๋ฆฌ๋ ์ฑ๊ณตํ ๋๊น์ง ๋ฃจํ์์ ์๋ํ์ง ์์์ผ ํ๋ฉฐ ์คํจํ ๋ฐ๋ณต ํ ๊ธธ์ด๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๋ฉด ์ ๋ ๊น์?๋ง์ง๋ง์ผ๋ก, ์ด ์์ ๊ตฌ์ถ๋ ๊ณ ๊ธ API๋ ์ด๋ค ๋ชจ์ต์ผ๊น์? API ์ฌ์ฉ์ ์์ ํ ์ดํด๋ณด๋ฉด ์คํธ๋ฆฌ๋ฐ API์ ๋น์คํธ๋ฆฌ๋ฐ API ๋ชจ๋ ์ด๋ฏธ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ์ฌ์ง๊ฐ ๊ฑฐ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค! ๋ด๊ฐ ์์ํ๋ ์ฃผ์ ์ฐจ์ด์ ์ ์๋ IV, ์๋ ์ถ๋ ฅ ํฌ๊ธฐ ๋ฐ ์ํธํ๋ ๋ฐ์ดํฐ ์์ ๋ํ ์ ํ์ ๋๋ค.
Windows๋ ์คํธ๋ฆฌ๋ฐ์ ํ์ฉํฉ๋๋ค. OpenSSL๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๊ทธ ๋์ ๋๋ถ๋ถ ๊ธฐ์กด ๊ฐ๋ ์ ๊ทธ๊ฒ์ ๊ณ ์ ์์ผฐ์ต๋๋ค(๋ ๋ค "๊ทธ๋ฆฌ๊ณ ์ด ๋ฌธ์ ๊ฐ ์์ ์์ด ์ฒ๋ฆฌํด์ผ ํ๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค").
Go๋ ํ์ง ์๊ณ libsodium์ ํ์ง ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฌผ๊ฒฐ์ ๊ทธ๊ฒ์ ํ์ฉํ๊ณ ๋์ค์ ๋ฌผ๊ฒฐ์ ํ์ฉํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ฆผ์์ด ๋์ค์ ๋ฌผ๊ฒฐ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๊ณ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ท ๋ชจ๋ธ(์ํธํ/๋ณตํธํ์ ๋ํด ํธ์ถ ๊ฐ์ ํค๋ฅผ ์ ์งํ ์ ์์)์ ๋์ ํ ํ ์คํธ๋ฆฌ๋ฐ ์์๊ฐ ์ฆ๊ฐํ๋ฉด ์ฌํ๊ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋น ํจํด์ ์ค์ํ๋ API ์ ์์ด ์ ์ฉํด ๋ณด์ ๋๋ค. SIV๋ CCM ๋ชจ๋ ์คํธ๋ฆฌ๋ฐ ์ํธํ๋ฅผ ์ง์ํ์ง ์์ง๋ง ์ด๋ค์ ๋ํ ์คํธ๋ฆฌ๋ฐ API๋ ์ ์ฌ์ ์ผ๋ก ๋ฒํผ๋ง์ด ์ฌํฉ๋๋ค. ์ฌ๋ฌผ์ ๋ช ํํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์์ ๋ํ ์๊ณ ๋ฆฌ์ฆ ์์ฒด(SIV)๊ฐ ์ํธํ ์ถ๋ ฅ์ ํ๊ทธ๋ฅผ ํตํฉํ์ง ์๋ ํ ํ์ด๋ก๋์ ํ๊ทธ๋ฅผ ํฌํจํด์๋ ์ ๋ฉ๋๋ค(GCM ๋ฐ CCM์ ์ด๋ฅผ ๋ณ๋์ ๋ฐ์ดํฐ๋ผ๊ณ ๋ถ๋ฆ). ( E(...) => (c, t)
๋ E(...) => c || t
๋๋ E(...) => t || c
). API ์ฌ์ฉ์๋ ํ์คํ ์ด๊ฒ์ concat์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค(Spans๋ฅผ ์ ์ ํ๊ฒ ์ด๊ธฐ๋ง ํ๋ฉด ๋จ).
GCM ์ฌ์์ ํ๊ทธ ๋ถ์ผ์น ์ FAIL ์ด์ธ ์ ๋ฆด๋ฆฌ์ค๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. NIST๋ ์ด์ ๋ํด ๋งค์ฐ ๋ช ํํฉ๋๋ค. McGrew & Viega์ ์๋ณธ GCM ๋ ผ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์ํธ ํด๋ ์์ ์ ์ผ๋ฐ ํ ์คํธ๊ฐ ์๋ FAIL ์ ๋ฐํํ๊ณ ์บก์ํ ํด์ ๊ฐ ์ค์ง๋๊ณ ์ผ๋ฐ ํ ์คํธ๊ฐ ์ ๋ฌ๋๊ฑฐ๋ ์ถ๊ฐ ์ฒ๋ฆฌ๋์ง ์๊ณ ์ญ์ ๋ฉ๋๋ค.
์ด์ ์๊ฒฌ ์ค RUP์ ๋ํ ์ธ๊ธ์ ์์์ต๋๋ค. ๋จ์ง ์์ ํ๋ค์์ ๋ฟ์ ๋๋ค("์์ ๊ณ์ธต์ด ์ฒ๋ฆฌํ ๊ฒ์ ๋๋ค." - ์, ๋ง์ต๋๋ค).
๊ฐ๋จํฉ๋๋ค. GCM ์ํธํ๋ ์คํธ๋ฆฌ๋ฐํ ์ ์์ต๋๋ค. GCM ๋ณตํธํ๋ฅผ ์คํธ๋ฆฌ๋ฐํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ ์ด์ GCM์ด ์๋๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฌผ๊ฒฐ์ ๊ทธ๊ฒ์ ํ์ฉํ๊ณ ๋์ค์ ๋ฌผ๊ฒฐ์ ํ์ฉํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ฆผ์์ด ๋์ค์ ๋ฌผ๊ฒฐ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ์ ๊ณ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@bartonjs ๋ง ๊ทธ๋๋ก ๋ชจ๋ ๊ธฐ์ ๋ฐ ๋ ผ๋ฆฌ์ ๋ถ์์ ๋ฌด์ํ๊ณ ๋์ Go ๋ฐ libsodium ํ๋ก์ ํธ์ ๋ ์ง ๋ฅผ ์ค์ ๋ถ์์ ๋ํ ์ฝํ ํ๋ก์๋ก ์ฌ์ฉํ๊ณ ์์ต๋๊น? ๋ด๊ฐ ํ๋ก์ ํธ์ ์ด๋ฆ ์ ๊ธฐ๋ฐ์ผ๋ก ๋น์ทํ ์ฃผ์ฅ์ ํ๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ๋ํ ์ฐ๋ฆฌ๋ ์ธํฐํ์ด์ค ๋ฐ ๊ตฌํ์ ๊ฒฐ์ ํ๊ณ ์์ต๋๋ค. AEAD์ ๋ํด ๋น ์คํธ๋ฆฌ๋ฐ ์ธํฐํ์ด์ค ๋ฅผ ๊ฒฐ์ ํ๋ฉด ์ด๋ฌํ ๋ชจ๋ ๊ตฌํ ์ด ์ฐจํ์ ๋ฐฐ์ ๋๋ค๋ ๊ฒ์ ์๊ณ ๊ณ์ญ๋๊น?
์์ท ๋ชจ๋ธ(์ํธํ/๋ณตํธํ์ ๋ํด ํธ์ถ ๊ฐ์ ํค๋ฅผ ์ ์งํ ์ ์์)์ ๋์ ํ ํ ์คํธ๋ฆฌ๋ฐ ์์๊ฐ ์ฆ๊ฐํ๋ฉด ์ฌํ๊ฐํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง GitHub์์ ์ ์ฆ๋ ์์๊ฐ ๋ถ์กฑํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ธฐ์ ๋๋ ๊ณ ๊ฐ ์๊ตฌ ์ฅ์ ๋ณด๋ค ๋ ์ ์ ์์ ์ ์ง์ํ๋ ๊ฒ์ด ์์ ํ ๊ธฐ๋ฐํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ง์ ์ ๋๋ฌํ๊ณ ์์ต๋๋ค.
@bartonjs ๋ง ๊ทธ๋๋ก ๋ชจ๋ ๊ธฐ์ ๋ฐ ๋ ผ๋ฆฌ์ ๋ถ์์ ๋ฌด์ํ๊ณ ๋์ Go ๋ฐ libsodium ํ๋ก์ ํธ์ ๋ ์ง๋ฅผ ์ค์ ๋ถ์์ ๋ํ ์ฝํ ํ๋ก์๋ก ์ฌ์ฉํ๊ณ ์์ต๋๊น?
์๋์, ์ ๋ ์ด๊ฒ์ด ๋งค์ฐ ์ํํ๋ฉฐ AEAD ์คํธ๋ฆฌ๋ฐ์ ํผํด์ผ ํ๋ค๊ณ ๋งํ๋ ์ ๋ฌธ ์ํธํ์์ ์กฐ์ธ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ๋ CNG ํ์ "์ด๋ก ์ ์ผ๋ก๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ํ๋ค๊ณ ๋งํ์ง๋ง ์ค์ ๋ก๋ ๊ฑฐ์ ์๋ฌด๋ ํ์ง ์์ต๋๋ค"๋ผ๋ CNG ํ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ผํ์ฑ ๊ฒฝ๋ก๋ฅผ ํํ๋ค๋ ์ฌ์ค์ ๋จ์ํ ๊ฒฐ์ ์ _๊ฐํํฉ๋๋ค_.
์ง๊ธ๊น์ง GitHub์์ ์ ์ฆ๋ ์์๊ฐ ๋ถ์กฑํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ช ๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์ธ๊ธ๋์์ต๋๋ค. ํธ์ถ์๊ฐ ๋ฐ์ดํฐ ๋ฆฌ์ด์
๋ธ๋ฆฌ๋ฅผ ์ํํ๋๋ก ํ๋ ๋์ API๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋๋ ์๋๋ฆฌ์ค๊ฐ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ ์กฐ๊ฐ๋ ๋ฒํผ ์ฒ๋ฆฌ๋ ReadOnlySequence
์๋ฝ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํฐ ํ์ผ์ด ๋ฌธ์ ์ง๋ง GCM์ด 64GB์ ๋ถ๊ณผํ ์ปท์คํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํฐ ํ์ผ์ ์ด๋ฏธ ๋ฌธ์ ์ ๋๋ค. ์์ ์). ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ์ฌ์ฉํ๋ฉด 2GB RAM ์์ด๋ ์คํฌ(์ต๋ 2^31-1)์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ต๋๊ฐ์์ ๋ช ๋นํธ๋ฅผ ์ค์์ต๋๋ค... ์ด์จ๋ ์๊ฐ์ด ์ง๋๋ฉด์ ์ผ์ด๋ ๊ฒ์ ๋๋ค.
AEAD์ ๋ํด ๋น ์คํธ๋ฆฌ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ฒฐ์ ํ๋ฉด ์ด๋ฌํ ๋ชจ๋ ๊ตฌํ์ด ์ฐจํ์ ๋ฐฐ์ ๋๋ค๋ ๊ฒ์ ์๊ณ ๊ณ์ญ๋๊น?
๋๋ ์๋ง๋ ํฉ๋ฆฌ์ ์ธ ํตํฉ ์ธํฐํ์ด์ค๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ @GrabYourPitchforks ๊ฐ ์ณ์๋ค๊ณ ์ ์ ๋ ํ์ ํฉ๋๋ค(https://github.com/dotnet/corefx/issues/23629#issuecomment-334638891). GCM _requireing_ nonce/IV ๋ฐ SIV _forbidding_ ์ด๋ AEAD ๋ชจ๋/์๊ณ ๋ฆฌ์ฆ์ ์ด๊ธฐํ๊ฐ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง์ ๋ํ ์ง์์ด ์ด๋ฏธ ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค... ์ค์ ๋ก AEAD์ ๋ํ "์ถ์ํ๋" ๊ฐ๋ ์ ์์ต๋๋ค. SIV๋ "ํ๊ทธ"์ ์์น๋ฅผ โโ์ง์ ํฉ๋๋ค. GCM/CCM์ ๊ทธ๋ ์ง ์์ต๋๋ค. SIV๋ ์ฌ์์ ๋ฐ๋ผ ํ๊ทธ ์ฐ์ ์ ๋๋ค.
SIV๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋๊น์ง ์ํธํ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์คํธ๋ฆฌ๋ฐ ์ํธํ๋ throw(์ด๋ ํธ์ถํ์ง ์์ผ๋ ค๋ฉด ์์์ผ ํจ) ๋๋ ๋ฒํผ(n^2 ์์ ์๊ฐ์ด ๋ฐ์ํ ์ ์์)๋ฅผ ๋ฐ์์ํต๋๋ค. ๊ธธ์ด๋ฅผ ์ ๋๊น์ง CCM์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ CNG๋ ๊ธธ์ด์ ๋ํ ์ฌ์ ์ํธํ ํํธ๋ฅผ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ๋์ผํ ๋ณดํธ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ณ์ ์ผ๋ณด๋ค ์๋ชป๋ ์ผ์ ํ๋ ๊ฒ์ด ๋ ์ฌ์ด ์ ๊ตฌ์ฑ ์์๋ฅผ ์ค๊ณํด์๋ ์ ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์ํธ ํด๋
์ ์ฌ์ฉํ๋ฉด ํ๊ทธ๊ฐ ํ์ธ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฒ๊ทธ๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ์ป์ ์ ์๋ Stream ํด๋์ค(CryptoStream์ ์ฌ์ฉํ์ฌ ๊ทธ๋ ๊ฒ ํ๋ ค๋ ์ ์)๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ๊ณ ์ ํน์ ์
๋๋ค. ์ด๋ AE์ ์ด์ ์ ๊ฑฐ์ ์์ ํ ๋ฌดํจํํฉ๋๋ค. . ( IGcmDecryptor
=> CryptoStream
=> StreamReader
=> XmlReader
=> "์ ๊น, ๊ทธ๊ฑด ํฉ๋ฒ์ ์ธ XML์ด ์๋๋๋ค..." => ์ ์ํ ์ํธ๋ฌธ ์ค๋ผํด) .
๊ทธ๊ฒ์ ์์ ์ ๋๋ฌํ๊ณ ์์ต๋๋ค ... ๊ณ ๊ฐ ์๊ตฌ.
๋ถํํ๋ ๋ด ์ธ์์์ ๋๋ฌด ๋ง์ด ๋ค์์ต๋๋ค. ๋ฏธ์ํ์ง๋ง ๋น์ ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ณ ๊ฐ์ด ์๋๋๋ค. GCM์ ์์ ํ๊ฒ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์์ ์ธ์ ํฉ๋๋ค. ํ๊ทธ ํ์ธ์ด ๋๋ ๋๊น์ง ํ๋ฐ์ฑ ํ์ผ/๋ฒํผ/๋ฑ์ผ๋ก๋ง ์คํธ๋ฆฌ๋ฐํ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋์ค ๊ด๋ฆฌ๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์๊ณ ์๊ณ ์๋ชป๋ ์ํ๋ ์๊ณ ์์ต๋๋ค. ์คํธ๋ฆผ ํฌ๊ธฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ 2^36-64๋ฐ์ดํธ ํ์ ์ GCM ์ธ๊ทธ๋จผํธ๋ก ์๋ผ์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋น์ ์ ๋ชจ๋ ๊ฒ์ ๋งํ๊ณ ์๋ฃํ ํ์ ๋น์ ์ด ๊ทธ ์ผ์ ์๋ชป ์ดํดํ๋ ๊ฒ์ ๋น์ ์ ๋ฒ๊ทธ๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ด๊ฐ ์ผ๋์ ๋๊ณ ์๋ ๊ณ ๊ฐ์ ์์ฌ๊ฐ ์ง์ํ๊ธฐ ๋๋ฌธ์ "์ํธํํด์ผ ํจ"์ ์๊ณ ์๋ ์ฌ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ์ํธํ ๋ฐฉ๋ฒ์ ๊ฒ์ํ ๋ ์ผ๋ถ ํํ ๋ฆฌ์ผ์์ "ํญ์ AE ์ฌ์ฉ"์ด๋ผ๊ณ ๋งํ๊ณ GCM์ ์ธ๊ธํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ CryptoStream์ ์ฌ์ฉํ๋ ".NET์ ์ํธํ" ์์ต์๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ SSLv2๋ฅผ ์ ํํ ๊ฒ๊ณผ ๋์ผํ ์์ ์ ์ํํ๋ค๋ ์ฌ์ค์ ์ ํ ๋ชจ๋ฅด๊ณ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ก ์์ผ๋ก๋ ํ์ธ๋์ ์ ํํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ํ ๋ _๊ทธ_ ๋ฒ๊ทธ๋ ๋ ์ ์๊ณ ์๋ ๋ชจ๋ ์ฌ๋์ ๊ฒ์ด์ง๋ง ์๋ชป๋ ์ผ์ ๋๋ฌด ์ฝ๊ฒ ํ๋๋ก ๋ด๋ฒ๋ ค ๋์ญ์์ค.
๋น์ ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ณ ๊ฐ์ด ์๋๋๋ค [...] ๋ฐ๋ฉด์ ๋ด๊ฐ ์๊ฐํ๋ ๊ณ ๊ฐ์ ์์ฌ๊ฐ [...]
@bartonjs ๋ช ๋ฌ ์ ์ ์ฐ๋ฆฌ๋ ๋ชฉํ๊ฐ ๋ฎ์ ์์ค์ API(๊ฐ๋ ฅํ์ง๋ง ํน์ ์กฐ๊ฑด์์๋ ์์ ํ์ง ์์)์ ๋์ ์์ค์ API(์๋ฒฝํ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๊ณ ๊ฐ ํ๋กํ์ ๋์์ผ๋ก ์ง์ ํ๋ ๊ฒ์ด๋ผ๊ณ ์ด๋ฏธ ๊ฒฐ์ ํ์ต๋๋ค. ์ ๋ชฉ์๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ ํ์คํ ์์ ๊ตญ๊ฐ์ด์ง๋ง, ์ด์ ๋ค๋ฅธ ์ฃผ์ฅ์ ํ์ฌ ๊ณจ๋๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ ์ ์งํ์ง ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ด๊ฐ ์ผ๋์ ๋๊ณ ์๋ ๊ณ ๊ฐ์ ์์ฌ๊ฐ ์ง์ํ๊ธฐ ๋๋ฌธ์ "์ํธํํด์ผ ํจ"์ ์๊ณ ์๋ ์ฌ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ์ํธํ ๋ฐฉ๋ฒ์ ๊ฒ์ํ ๋ ์ผ๋ถ ํํ ๋ฆฌ์ผ์์ "ํญ์ AE ์ฌ์ฉ"์ด๋ผ๊ณ ๋งํ๊ณ GCM์ ์ธ๊ธํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ CryptoStream์ ์ฌ์ฉํ๋ ".NET์ ์ํธํ" ์์ต์๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ SSLv2๋ฅผ ์ ํํ ๊ฒ๊ณผ ๋์ผํ ์์ ์ ์ํํ๋ค๋ ์ฌ์ค์ ์ ํ ๋ชจ๋ฅด๊ณ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ก ์์ผ๋ก๋ ํ์ธ๋์ ์ ํํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ํ ๋ ๊ทธ ๋ฒ๊ทธ๋ ๋ ์ ์๋ ๋ชจ๋ ์ฌ๋์๊ฒ ์ํ์ง๋ง ์๋ชป๋ ์ผ์ ๋๋ฌด ์ฝ๊ฒ ํ๋๋ก ๋ด๋ฒ๋ ค ๋์ญ์์ค.
@bartonjs ์ ๊น, ์ ์์ค ํ๋ฆฌ๋ฏธํฐ๋ธ๋ ์ด๋ป๊ฒ ๋์๋์? ๋๋ ์ด ํน๋ณํ ๋ฌธ์ ์ ๋ชฉ์ ์ด ์ก์์ ๋ํ ์ ์ฐ์ฑ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๊ณํ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฐ๋์ ์๋ ค์ฃผ์ญ์์ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
๋ํ ๋ธ๋ก๋ณ ๋ฐฉ์์ด ์์ง ๊ณ ๋ ค ์ค์ ๋๊น, ์๋๋ฉด ์์ท ๋ฐฉ์์ธ๊ฐ์?
๋๋ ์๋ง๋ ํฉ๋ฆฌ์ ์ธ ํตํฉ ์ธํฐํ์ด์ค๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ @GrabYourPitchforks ๊ฐ ์ณ์๋ค๋ ๊ฒ์ ์ ์ ๋ ํ์ ํฉ๋๋ค(#23629 (comment)).
๋ชจ๋ ์๋ฅผ ๋ณด๋ฉด ์ด๊ฒ์ ์ ์ ๋ ๋ฌด์ตํด ๋ณด์ด๊ธฐ ์์ํฉ๋๋ค. ํนํ ๊ตฌํ์ ์๋ก ๋ค๋ฅธ ์ ํ์ด ์๋ ์ ์์ค API์ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ํตํฉํ๊ธฐ๋ณด๋ค๋ AES-GCM์ผ๋ก ํ์คํ ์๋ฅผ ์ค์ ํด์ผ ํ ๊ฒ์ ๋๋ค. ์ฐธ๊ณ ๋ก ํ์๋ ๋ฏธ๋์ ๊ณ ๊ธ API์ ์ฌ์ ํ ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค. ๋ ์ ํ์ ์ด๋ผ๋ ์์ฑ์ผ๋ก ์ธํด ํตํฉ ์ธํฐํ์ด์ค๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๋ธ๋ก๋ณ ๋ฐฉ๋ฒ์ด ์์ง ๊ณ ๋ ค ์ค์ ๋๊น, ์๋๋ฉด ์์ท ๋ฐฉ๋ฒ์ ๋๊น?
https://github.com/dotnet/corefx/issues/23629#issuecomment -378605071์์ ์ธ๊ธํ๋ฏ์ด ์ํ ๋ ๋ณด์ ๋ ํํ๋ ์ฌ์ฉ ์ฌ๋ก์์ AE์ ์์ท ๋ฒ์ ๋ง ํ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ ์ฒด ํ ๋ก ์ ์ฝ์ง ์์๊ณ ์์์ ๋ถ๋ถ๋ง ์ฝ์์ต๋๋ค. ์ด๋ค ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๊ฐ ์ด ๊ธ์ด ์ด ๋งฅ๋ฝ์์ ์ดํด๊ฐ ๋์ง ์๋๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ๋ด 2ยข:
์ฐ๋ฆฌ(.NET ๋ณด์ ํ)๋ ์ฐ๋ฆฌ์ Microsoft ๋ด์ ๊ด๋ฒ์ํ ์ํธํ ํ๊ณผ ์๋ ผํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ์ค๋ ๋์์ ์ธ๊ธ๋ ๋ง์ ๋ฌธ์ ์ ์ฐ๋ ค ์ฌํญ์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ์ด๋ฌํ ์ฐ๋ ค๋ ์คํธ๋ฆฌ๋ฐ GCM API๋ฅผ ํ๋ ์์ํฌ ๋ด์ ํต์ฌ ๋น๋ฉ ๋ธ๋ก์ผ๋ก ๋์ ํ๋ ๊ฒ์ ๋ณด์ฆํ ๋งํผ ์ค๋๋ ฅ์ด ์์์ต๋๋ค.
์ด ๊ฒฐ์ ์ ํฅํ ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ฒํ ๋ ์ ์์ต๋๋ค. ๊ทธ ๋์ ์ฐ๋ฆฌ๋ ํ์ฌ๋ณด๋ค ์ํฉ์ ๋ ์ ํ์ํค์ง ์์์ต๋๋ค. ํ์ฌ ์คํธ๋ฆฌ๋ฐ GCM ์ง์์ ์ํด ํ์ฌ ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฐ๋ฐ์๋ ๊ณ์ ๊ทธ๋ ๊ฒ ํ ์ ์์ผ๋ฉฐ ์๋ํ ๋์ ์ผ๋ก ์ธํด ์ค๋จ๋์ง ์์ ๊ฒ์ ๋๋ค. ๋น ์คํธ๋ฆฌ๋ฐ GCM API.
๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์๋ ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@pgolebiowski ์์ ํ ์คํธ๋ฆฌ๋ฐ ์ํธํ๋ฅผ ์ ๊ณตํ๋๋ก ํน๋ณํ ์ค๊ณ๋ ๊ณ ๊ธ .NET ์ํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@sdrapkin ์ด๊ฒ์ ๋ง๋ณด๋ค ์ฝ์ต๋๋ค. "์์ ํ๋ค"๋ ์ง๋ฌธ์ด ๋ง์ต๋๋ค. ์ ์ฆ๋๊ณ ์ค์ ๋ก ์ ๋ขฐํ ์ ์๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ๋น์ ์ ์์ ์๊ฒ ๋งํฉ๋๋ค :
Bouncy Castle C# ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ผ๋ฐ์ ์ธ StackOverflow ๊ถ์ฅ ์ฌํญ). Bouncy Castle c#์ ๊ฑฐ๋ํ(145k LOC) ์ฑ๋ฅ์ด ์ ์กฐํ ํฌ๋ฆฝํ ๋ฐ๋ฌผ๊ด ์นดํ๋ก๊ทธ(์ผ๋ถ๋ ๊ณ ๋)๋ก, ์ค๋๋ Java ๊ตฌํ์ด ๋๋ฑํ๊ฒ ์ค๋๋ .NET(2.0?)์ผ๋ก ์ด์๋์์ต๋๋ค.
์ข์, ๊ทธ๋์ ์ต์ ์ ๋ฌด์์ ๋๊น? ์ด์ฉ๋ฉด ๋น์ ์ ๋์๊ด? ์๋ ์ ๋ง . ํ ... ์๋ง๋ libsodium-net? ์๋ ์ ๋ง .
์คํ๋ ค ์ ๋ขฐํ ์ ์๋ ์์ค(์: Microsoft ๋๋ ์ปค๋ฎค๋ํฐ์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ)์์ ์ ๊ณต๋๋ ๊ฐ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์ ๋ก ์ฐพ์ ๋ .NET Core ์ธ๊ณ์ ๊ทธ๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@pgolebiowski ์ต์ ์ ํ๋ฆฝ๋ .NET ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋น์ ์ด ์ํ๋ ๋๋ก ์ ์ฆ๋์๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐ๋ก ๊ทธ ๊ฒ. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ)๋ Microsoft๊ฐ ECDH์ ๊ฐ์ ๋๋ฝ๋ ์ํธํ ๊ธฐ๋ณธ ์์๋ฅผ NetStandard์ ์ถ๊ฐํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
Inferno ํฌํฌ ๋ ๋ณผ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ฌ์ํ ๋ณ๊ฒฝ์ผ๋ก NetStandard20์ ๋ฌ์ฑํ ํฌํฌ๊ฐ 2๊ฐ ์ด์ ์์ต๋๋ค.
๊ทํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ 2๋ ์ ์ ํ ์ฌ๋ ์ ์ํด 2์ผ ์ด๋ด์ ๊ฐ์ฌ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ฏฟ์ง ์์ต๋๋ค, ์ฃ์กํฉ๋๋ค. Microsoft์๋ ์ด๋ฅผ ์ํ ์ ๋ด ํ์ด ์์ต๋๋ค. ์ ๋ Cure53์ ์ฌ๋๋ค๋ณด๋ค ๋ ์ ๋ขฐํ๋ ์ฌ๋๋ค๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
์ง์งํ๊ฒ, ์ฐ๋ฆฌ๋ ๋ง์ ๊ฒ์ ๋ํ ์ 3์ ์ง์์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ํ ๋ชจ๋ ๋ณด์ ๊ด๋ จ ํญ๋ชฉ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
@pgolebiowski ๋๊ตฐ๊ฐ์๊ฒ ๋ฌด์์ด๋ ๋ฏฟ์ผ๋ผ๊ณ ์ค๋ํ๋ ๊ฒ์ ์ ๊ฐ ํ ์ ์๋ ์ผ์ด์ง๋ง ๊ทํ์ ์ง์ ์ ์ ํํ์ง ์์ต๋๋ค. Inferno๋ "Cure53" ์กฐ์ง์ 2๋ช ์ ์ ๋ฌธ๊ฐ๊ฐ ๊ฐ์ฌํ์ต๋๋ค. ๊ฐ์ฌ๋ 2์ผ์ด ๊ฑธ๋ ธ๊ณ ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ~1,000๋ผ์ธ์ ์ฝ๋์์ต๋๋ค. ํ๋ฃจ์ ๊ฐ์ฌ์๋น ~250์ค์ ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฌ์ค, ์์ฌ์ด ๊ฐ์ฌ ๊ธฐ๋ฅ์ Inferno์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค. ์ ํํ๋ ์ ๋ขฐํ๊ณ ์ถ์ง ์์ ์ฌ๋๋ค์ ์ํ ๊ฒ์ ๋๋ค.
์ด ์ค๋ ๋์ ๋ชฉํ๋ AES-GCM์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๊ทํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ AES-GCM๋ ์ง์ํ์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด ๊ทํ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ค๋ฉด corefx์ ๋ํ ์ ์์ผ๋ก ์ ์ถํ์ญ์์ค. ์ ์ ํ ์ค๋ ๋์์.
๋ ๋ค๋ฅธ ์ ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๋๋ผ๋ .net ์ํธํ ์์ํ์์ ๊ฒํ ํ์ง ์์์ผ๋ฉฐ corefx์ ์ผ๋ถ๊ฐ ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌํ ๊ฒํ ๋ฅผ ์ํ ํ๋ณด์กฐ์ฐจ ์๋๋๋ค. ์ด๊ฒ์ ์ด ํ๋ ํ ๋ก ๊ณผ ๊ด๊ณ ์ ๋์ ์๋ฏธํฉ๋๋ค.
@pgolebiowski ๋๋ ์๋ฌด ๊ฒ๋ ๊ด๊ณ ํ์ง ์์์ต๋๋ค. ๋จ์ง ๊ทํ์ ์ง๋ฌธ์ ๋ต๋ณํ๊ณ , ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋์์ ์ ์ํ๊ณ , ๋ถ์ ํํ ์ฃผ์ฅ์ ์์ ํ์ ๋ฟ์ ๋๋ค. AES-GCM์ ์คํธ๋ฆฌ๋ฐ ์ํธํ์ ์ ํฉํ์ง ์์ผ๋ฉฐ, ์ด๋ .NET ๋ณด์ ํ์์ ๊ฒํ ๋ฐ ๋์ํ ์ฌํญ ์ด๋ฏ๋ก ์ ๋ขฐํ ์ ์์ต๋๋ค.
์ด๋์์๋ ์คํธ๋ฆฌ๋ฐ AES-GCM์ ๋ฐฉ์ดํ๊ณ ์์ต๋๊น? ๊ธฐ์ตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ง์ ๊ธฐ์ตํ ์ ์์ต๋๋ค.
- ์คํธ๋ฆผ์ด ์ค์ํฉ๋๋ค. ๋ณด์ ์ทจ์ฝ์ฑ์ ์๋ฏธํ๋ฏ๋ก ์ง์ ์ง์ํ ์ ์๋ ๊ฒฝ์ฐ ๊ฐ๋ฅํ๋ฉด ์คํธ๋ฆผ์ ๋ ธ์ถํ๋ ์ ์์ค API ์์ ๊ตฌ์ถ๋ ๊ณ ์์ค ๋ํผ๋ฅผ ์ ๊ณตํ์ญ์์ค(๋นํจ์จ์ ์ด์ง๋ง ์์ ํ ๋ฐฉ๋ฒ์ผ๋ก).
- AES-GCM์ด ์ด๋ค ์๋๋ฆฌ์ค์์๋ ์คํธ๋ฆผ์ ์ ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์คํธ๋ฆผ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ AES-CBC-HMAC์ ํฉ๋ฒ์ ์ธ ๊ตฌํ์ ์ ๊ณตํ์ญ์์ค. ๋๋ ๋ค๋ฅธ AE ์๊ณ ๋ฆฌ์ฆ.
๋๋ corefx์ ๋ํ ๋ฏธํด๊ฒฐ ๋ฌธ์ ์ธ๊ธ:
๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์๋ ๋ฐ์ดํฐ ์ํธํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
๋ณด๋์ค:
Inferno ํฌํฌ๋ ๋ณผ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ฌ์ํ ๋ณ๊ฒฝ์ผ๋ก NetStandard20์ ๋ฌ์ฑํ ํฌํฌ๊ฐ 2๊ฐ ์ด์ ์์ต๋๋ค. [...] Inferno๋ "Cure53" ์กฐ์ง์ 2๋ช ์ ์ ๋ฌธ๊ฐ๊ฐ ๊ฐ์ฌํ์ต๋๋ค. [...] ๊ฐํธํ ๊ฐ์ฌ ๊ธฐ๋ฅ์ Inferno์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค.
๋๋ ์๋ฌด๊ฒ๋ ๊ด๊ณ ํ์ง ์์๋ค
์ ์ณ๋๊ณ ๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์๊ฐํ๋ ์๋ฏธ์์ "์คํธ๋ฆฌ๋ฐ"์ ์ ๋ง๋ก ์ํ์ง ์์์ต๋๋ค. ์ฑ๋ฅ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์์ ์ด์ ๋ก "์ฐจ๋จ" ์ฒ๋ฆฌ๋ฅผ ์ํ์ต๋๋ค. ๋๋ ์ค์ ๋ก ๊ฒฐ๊ณผ๋ฅผ "์คํธ๋ฆฌ๋ฐ"ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ด๊ฒ์ด openssl ๋ฐ cng ์ง์์ด ๊ทธ๊ฒ์ ์๋ ๊ฒ์ด ๋ถ๋๋ฝ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๊ฐ ์๊ฐํ ์์๋ ๋ชจ๋ ์๋๋ฆฌ์ค์์ "์์"๋ฅผ ์ธ๋ชจ ์๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
@Drawaes ์๊ฐํด๋ณด๋ฉด ๋ธ๋ก ์์
์ด ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์์ ํ ์ ์์ต๋๋ค. ํ์ ๋๋ ์คํธ๋ฆผ์ ๋ง์ง ์ ์์ง๋ง ๋ธ๋ก ์์
๋ณด๋ค ์์ท API๋ฅผ ํจ์ฌ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๊ฒ๋ค๊ฐ ๋ธ๋ก ์์
์ XmlReader
์ _์ง์ ์ ์ผ๋ก_ ๊ฒฐํฉ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก ๋
ผ์๋ ๋ง์ ์ํ์ ์คํธ๋ฆผ ๊ฐ์ฒด์ ์ ์ฉ๋์ง๋ง ๋ธ๋ก ์์
์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
์์ท API๋ ์ฌ์ฉํ ์ ์์ ๋ ๋ธ๋ก ์์ ์ ์ํํ๋ ค๋ฉด ์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ์๊ณ ์์ผ๋ฉฐ ํนํ ๋ฎ์ ์์ค์ ์กฐ์ ์ด ํ์ํ๋ค๊ณ ์ ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํ์ ๋๋ฅผ ๋ณดํธํ ์ ์๊ณ _๊ทธ๋ฆฌ๊ณ _ ์ ์ฐ์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค.
RUP๋ฅผ ํผํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ, ๋๋ ์ฌ์ ํ GCM์ ๋ํ ์ด์ ์ฐจ๋จ ์์ ์ด ์ผ๋ง๋ ๋ง์์ง ์๊ณ ํ๊ณ ์์ต๋๋ค. ์ํธํ๋ ๋ชจ๋ ์ด์ ์ ์ป๋ ๋ฐ๋ฉด ๋ณตํธํ๋ ์ฝ๊ฐ๋ง ์ด์ ์ ์ป์ต๋๋ค. ์ ์ฒด ์ํธ๋ฌธ์ ์ ์ฅํ๋ ๊ฒ์ ํผํ ์ ์์ง๋ง ์ฌ์ ํ ์ ์ฒด ํ๋ฌธ์ ๋ฒํผ๋งํด์ผ ํฉ๋๋ค. ์ํธ ํด๋ ๊ธฐ๋ ๋์คํฌ์ ์ค๊ฐ ์ผ๋ฐ ํ ์คํธ๋ฅผ ์ ์ฅํ๋๋ก _์ ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋๊ฐ๋ก ์ฐ๋ฆฌ๋ ๋ ๋ง์ ์ค๋ฅ์ ์ฌ์ง๋ฅผ ๋์ ํ์ต๋๋ค. ๋ ๋์ ์์ค์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ง๋ผ๋ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ด ์์ต๋๊น(์: ์ฒญํฌ ๋๋ ์ง์ ํ ์คํธ๋ฆฌ๋ฐ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ)?
TLS ๋ฐ ํ์ดํ๋ผ์ธ. ํ์ฌ(๊ทธ๋ฆฌ๊ณ ์์ธก ๊ฐ๋ฅํ ๋ฏธ๋์) ํ์ดํ๋ผ์ธ์ 4k ๋ธ๋ก์ ์ฌ์ฉํ์ง๋ง tls ๋ฉ์์ง๋ 16k์ ์ํธ๋ฌธ์ผ ์ ์์ต๋๋ค. ํ ๋ฒ์ 16k๋ฅผ ๋จ์ผ ์ฐ์ ๋ฒํผ์ ๋ณต์ฌํด์ผ ํด๋ ํ ์ ์์ต๋๋ค. ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด 4 ๋๋ 5๋ผ๊ณ ๋งํ ์ ์์ผ๋ฉฐ ๋ธ๋ก ๊ฒฝ์์ ์ํด ์ต๋ 16๋ฐ์ดํธ๋ฅผ ๋ฒํผ๋งํด์ผ ํ ์๋ ์์ต๋๋ค.
@Drawaes 16k๋ ์ฌ์ ํ ์ผ์ ํ๊ณ ๊ฑฐ๋ํ์ง ์์ต๋๋ค. ์ด ๋งฅ๋ฝ์์ ๋ง์ ์ฐจ์ด๊ฐ ์์ต๋๊น?
์, ํ์ดํ๋ผ์ธ์ ๋ค๋ฅธ ์ฌ๋ณธ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ์ฑ๋ฅ์ ์ค์ํ๊ณ ์ธก์ ๊ฐ๋ฅํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ฌด์์ด ํ์ํฉ๋๊น? ๋ค์ ๋จ๊ณ๋ ๋ฌด์์ ๋๊น? @๋๋ก์จ์ค
AES-GCM์ ๊ฒฝ์ฐ https://github.com/dotnet/corefx/issues/7023์์ ํด๋น ๋ฌธ์ ๊ฐ ์ ๊ฒจ ์์ด ์ ๋ฌ์ด ์ ๋๋ก ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. @blowdart , ์ ๊ธ์ ํด์ ํ ์ ์์ต๋๊น? ์ฌ๋๋ค์ด ํ ๋ก ํ ์ ์์ ๋ ๋ฐ์ ํ๊ธฐ๋ ์ ๋ง ์ด๋ ต์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ต์ ์ด ์๋ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ ๋์ค์๊ฒ ์ ๊ณตํ ์ ์๋ ๋์ฒด ์๋ฃจ์ ์ ์ ์ํ ์ ์์ต๋๋ค.
์๋์, ์ ๊ธ์ ํด์ ํ์ง ์์ต๋๋ค. ๊ฒฐ์ ์ด ๋ด๋ ค์ก๊ณ ์ฃผ์ ๊ฐ ๋๋ฌ์ต๋๋ค.
@blowdart ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค. ์๋ง๋ ์ด๊ฒ์ด ์ถฉ๋ถํ ๋ช ํํ์ง ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ต์ ์ด ์๋ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ ๋์ค์๊ฒ ์ ๊ณตํ ์ ์๋ ๋์ฒด ์๋ฃจ์ ์ ์ ์ํ ์ ์์ต๋๋ค.
AES-GCM์ ์ง์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒ์ ๋ํด ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ๋ฅญํฉ๋๋ค. ์ ๋ ํ์คํ ๊ทธ ์๊ณ ๋ฆฌ์ฆ์ ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์ค์ ๋ก ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. AES-GCM ์ค๊ณ ๋ฐ ๊ตฌํ์ ๋ํ ํ ๋ก ์ด ์ฌ๊ธฐ์์ ์ด๋ฆฌ๊ธฐ๋ฅผ ์ํ์ญ๋๊น ์๋๋ฉด ์๋ก์ด ํธ์์ ์ด๋ฆฌ๊ธฐ๋ฅผ ์ํ์ญ๋๊น?
๋ํ ํด๋น ์ฃผ์ ๊ฐ ์๋ฃ๋๋ฉด ์ ๋ซ์ง ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๋น์ฅ ๊ตฌํ์ ๋ํ ๋ ผ์๊ฐ https://github.com/dotnet/corefx/issues/7023์์ ์ด๋ฆด ๊ฒ์ด๋ผ๊ณ ์ ์ํ๋ฏ๋ก ํด๋น ๋ฌธ์ ์ ์ ๋ชฉ์ ๋ณ๊ฒฝํ์ฌ ๋ ๋ช ํํ๊ฒ ๋ง๋์ญ์์ค. ์ด๋ค AEAD ์๊ณ ๋ฆฌ์ฆ์ ๋จผ์ ์ง์ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ผ ์ ์์ต๋๋ค.
์ฆ, ํ์ฌ ์ํฉ์์ AES-GCM์ ์ถ์งํ๊ธฐ ์ํด ๋ฌด์์ด ํ์ํ์ง ๋ถ๋ถ๋ช ํ๋ค๋ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
@karelz
@pgolebiowski ์ด๋ฏธ PR์ด ๋์์ด์. ๋ค์์ฃผ ๋ง์คํฐ ์์์ผ์ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋์, ์ ๋ ์ด๊ฒ์ด ๋งค์ฐ ์ํํ๋ฉฐ AEAD ์คํธ๋ฆฌ๋ฐ์ ํผํด์ผ ํ๋ค๊ณ ๋งํ๋ ์ ๋ฌธ ์ํธํ์์ ์กฐ์ธ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ๋ CNG ํ์ "์ด๋ก ์ ์ผ๋ก๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ํ๋ค๊ณ ๋งํ์ง๋ง ์ค์ ๋ก๋ ๊ฑฐ์ ์๋ฌด๋ ํ์ง ์์ต๋๋ค"๋ผ๋ CNG ํ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ผํ์ฑ ๊ฒฝ๋ก๋ฅผ ํํ๋ค๋ ์ฌ์ค์ ๋จ์ํ ๊ฒฐ์ ์ _๊ฐํํฉ๋๋ค_.
๋ช ๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์ธ๊ธ๋์์ต๋๋ค. ํธ์ถ์๊ฐ ๋ฐ์ดํฐ ๋ฆฌ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ํํ๋๋ก ํ๋ ๋์ API๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋๋ ์๋๋ฆฌ์ค๊ฐ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ ์กฐ๊ฐ๋ ๋ฒํผ ์ฒ๋ฆฌ๋
ReadOnlySequence
์๋ฝ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.ํฐ ํ์ผ์ด ๋ฌธ์ ์ง๋ง GCM์ด 64GB์ ๋ถ๊ณผํ ์ปท์คํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํฐ ํ์ผ์ ์ด๋ฏธ ๋ฌธ์ ์ ๋๋ค. ์์ ์). ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ์ฌ์ฉํ๋ฉด 2GB RAM ์์ด๋ ์คํฌ(์ต๋ 2^31-1)์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ต๋๊ฐ์์ ๋ช ๋นํธ๋ฅผ ์ค์์ต๋๋ค... ์ด์จ๋ ์๊ฐ์ด ์ง๋๋ฉด์ ์ผ์ด๋ ๊ฒ์ ๋๋ค.
๋๋ ์๋ง๋ ํฉ๋ฆฌ์ ์ธ ํตํฉ ์ธํฐํ์ด์ค๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ @GrabYourPitchforks ๊ฐ ์ณ์๋ค๊ณ ์ ์ ๋ ํ์ ํฉ๋๋ค(https://github.com/dotnet/corefx/issues/23629#issuecomment-334638891). GCM _requireing_ nonce/IV ๋ฐ SIV _forbidding_ ์ด๋ AEAD ๋ชจ๋/์๊ณ ๋ฆฌ์ฆ์ ์ด๊ธฐํ๊ฐ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง์ ๋ํ ์ง์์ด ์ด๋ฏธ ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค... ์ค์ ๋ก AEAD์ ๋ํ "์ถ์ํ๋" ๊ฐ๋ ์ ์์ต๋๋ค. SIV๋ "ํ๊ทธ"์ ์์น๋ฅผ โโ์ง์ ํฉ๋๋ค. GCM/CCM์ ๊ทธ๋ ์ง ์์ต๋๋ค. SIV๋ ์ฌ์์ ๋ฐ๋ผ ํ๊ทธ ์ฐ์ ์ ๋๋ค.
SIV๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋๊น์ง ์ํธํ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์คํธ๋ฆฌ๋ฐ ์ํธํ๋ throw(์ด๋ ํธ์ถํ์ง ์์ผ๋ ค๋ฉด ์์์ผ ํจ) ๋๋ ๋ฒํผ(n^2 ์์ ์๊ฐ์ด ๋ฐ์ํ ์ ์์)๋ฅผ ๋ฐ์์ํต๋๋ค. ๊ธธ์ด๋ฅผ ์ ๋๊น์ง CCM์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ CNG๋ ๊ธธ์ด์ ๋ํ ์ฌ์ ์ํธํ ํํธ๋ฅผ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ๋์ผํ ๋ณดํธ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ณ์ ์ผ๋ณด๋ค ์๋ชป๋ ์ผ์ ํ๋ ๊ฒ์ด ๋ ์ฌ์ด ์ ๊ตฌ์ฑ ์์๋ฅผ ์ค๊ณํด์๋ ์ ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์ํธ ํด๋ ์ ์ฌ์ฉํ๋ฉด ํ๊ทธ๊ฐ ํ์ธ๋๊ธฐ ์ ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฒ๊ทธ๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ์ป์ ์ ์๋ Stream ํด๋์ค(CryptoStream์ ์ฌ์ฉํ์ฌ ๊ทธ๋ ๊ฒ ํ๋ ค๋ ์ ์)๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ๊ณ ์ ํน์ ์ ๋๋ค. ์ด๋ AE์ ์ด์ ์ ๊ฑฐ์ ์์ ํ ๋ฌดํจํํฉ๋๋ค. . (
IGcmDecryptor
=>CryptoStream
=>StreamReader
=>XmlReader
=> "์ ๊น, ๊ทธ๊ฑด ํฉ๋ฒ์ ์ธ XML์ด ์๋๋๋ค..." => ์ ์ํ ์ํธ๋ฌธ ์ค๋ผํด) .๋ถํํ๋ ๋ด ์ธ์์์ ๋๋ฌด ๋ง์ด ๋ค์์ต๋๋ค. ๋ฏธ์ํ์ง๋ง ๋น์ ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๊ณ ๊ฐ์ด ์๋๋๋ค. GCM์ ์์ ํ๊ฒ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์์ ์ธ์ ํฉ๋๋ค. ํ๊ทธ ํ์ธ์ด ๋๋ ๋๊น์ง ํ๋ฐ์ฑ ํ์ผ/๋ฒํผ/๋ฑ์ผ๋ก๋ง ์คํธ๋ฆฌ๋ฐํ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋์ค ๊ด๋ฆฌ๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์๊ณ ์๊ณ ์๋ชป๋ ์ํ๋ ์๊ณ ์์ต๋๋ค. ์คํธ๋ฆผ ํฌ๊ธฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ 2^36-64๋ฐ์ดํธ ํ์ ์ GCM ์ธ๊ทธ๋จผํธ๋ก ์๋ผ์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋น์ ์ ๋ชจ๋ ๊ฒ์ ๋งํ๊ณ ์๋ฃํ ํ์ ๋น์ ์ด ๊ทธ ์ผ์ ์๋ชป ์ดํดํ๋ ๊ฒ์ ๋น์ ์ ๋ฒ๊ทธ๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฐ๋ฉด์ ๋ด๊ฐ ์ผ๋์ ๋๊ณ ์๋ ๊ณ ๊ฐ์ ์์ฌ๊ฐ ์ง์ํ๊ธฐ ๋๋ฌธ์ "์ํธํํด์ผ ํจ"์ ์๊ณ ์๋ ์ฌ๋์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ์ํธํ ๋ฐฉ๋ฒ์ ๊ฒ์ํ ๋ ์ผ๋ถ ํํ ๋ฆฌ์ผ์์ "ํญ์ AE ์ฌ์ฉ"์ด๋ผ๊ณ ๋งํ๊ณ GCM์ ์ธ๊ธํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ CryptoStream์ ์ฌ์ฉํ๋ ".NET์ ์ํธํ" ์์ต์๋ฅผ ์ฐพ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ทธ๋ค์ SSLv2๋ฅผ ์ ํํ ๊ฒ๊ณผ ๋์ผํ ์์ ์ ์ํํ๋ค๋ ์ฌ์ค์ ์ ํ ๋ชจ๋ฅด๊ณ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ก ์์ผ๋ก๋ ํ์ธ๋์ ์ ํํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ํ ๋ _๊ทธ_ ๋ฒ๊ทธ๋ ๋ ์ ์๊ณ ์๋ ๋ชจ๋ ์ฌ๋์ ๊ฒ์ด์ง๋ง ์๋ชป๋ ์ผ์ ๋๋ฌด ์ฝ๊ฒ ํ๋๋ก ๋ด๋ฒ๋ ค ๋์ญ์์ค.