Runtime: ์•”ํ˜ธ๋ฅผ ์œ„ํ•œ ์ผ๋ฐ˜ ์ €์ˆ˜์ค€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(AES-GCM์ด ์ฒซ ๋ฒˆ์งธ์ž„)

์— ๋งŒ๋“  2017๋…„ 08์›” 29์ผ  ยท  143์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/runtime

์ด๋ก ์  ํ•ด์„

์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ๋งŽ์€ ์•”ํ˜ธ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค์˜ ํ˜ผํ•ฉ์€ ์•ฝ๊ฐ„ ๋ถ„๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ AEAD ์Šคํƒ€์ผ ์•”ํ˜ธ๋Š” ์ถ”๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋””์ž์ธ์€ ํ• ๋‹น๋˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐฐ์—ด๋กœ ์ธํ•ด ํ”ผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ API

๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์— ์˜ํ•ด ๊ตฌํ˜„๋  ๋ฒ”์šฉ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์žฅ์„ ํ—ˆ์šฉํ•˜๊ณ  ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง์œผ๋กœ์จ ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ˜ธ์ถœ ์‚ฌ์ด์— ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 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);
}

API ๋™์ž‘

  1. ์™„๋ฃŒ ์ „์— get ํƒœ๊ทธ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด [์˜ˆ์™ธ ์œ ํ˜•?]์ด ๋ฐœ์ƒํ•˜๊ณ  ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ฌดํšจ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์•”ํ˜ธ ํ•ด๋… ์™„๋ฃŒ ์‹œ ํƒœ๊ทธ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์™„๋ฃŒ๋˜๋ฉด Init ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  4. Init๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด "๋งˆ๋ฌด๋ฆฌ"ํ•˜์ง€ ์•Š๊ณ  ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  5. ์ดˆ๊ธฐ "์ดˆ๊ธฐํ™”" ํ˜ธ์ถœ์— IV๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ํ˜•์ด ํ‚ค๊ฐ€ ์ œ๊ณต๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ(์ง์ ‘ "์ƒˆ๋กœ ์ถ”๊ฐ€๋œ" ์ธ์Šคํ„ด์Šค) IV๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  6. ์œ ํ˜•์ด ์ €์žฅ์†Œ ๊ธฐ๋ฐ˜ ํ‚ค์—์„œ ์ƒ์„ฑ๋˜์—ˆ๊ณ  IV๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Init๋ฅผ ํ†ตํ•ด ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด throw๋ฉ๋‹ˆ๋‹ค.
  7. get ํƒœ๊ทธ๊ฐ€ dispose ๋˜๋Š” Init ์ „์— ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ ํƒœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด?

์ฐธ์กฐ dotnet/corefx#7023

์—…๋ฐ์ดํŠธ

  1. nonce๋ฅผ IV๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ํ–‰๋™ ์„น์…˜ ์ถ”๊ฐ€
  3. ์™„๋ฃŒ ๋ฐ ์—…๋ฐ์ดํŠธ์—์„œ ๋‹จ์ผ ์ž…๋ ฅ/์ถœ๋ ฅ ๋ฒ”์œ„ ์‚ฌ๋ก€๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ ๋ฉ”์„œ๋“œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. @bartonjs ๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ ์ŠคํŒฌ ์ˆ˜๋ฅผ readonlyspan์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
  5. ์ œ๊ฑฐ๋œ ์žฌ์„ค์ •, IV๊ฐ€ ์žˆ๋Š” ์ดˆ๊ธฐํ™”๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
api-suggestion area-System.Security

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@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๋ฅผ ์„ ํƒํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ƒ์œผ๋กœ๋Š” ํ™•์ธ๋ž€์„ ์„ ํƒํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ํ•  ๋•Œ _๊ทธ_ ๋ฒ„๊ทธ๋Š” ๋” ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๊ฒƒ์ด์ง€๋งŒ ์ž˜๋ชป๋œ ์ผ์€ ๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ํ•˜๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘์‹ญ์‹œ์˜ค.

๋ชจ๋“  143 ๋Œ“๊ธ€

์ œ์•ˆ๋œ API์— ๋Œ€ํ•œ ๋น ๋ฅธ ํŒ๋‹จ ํ”ผ๋“œ๋ฐฑ(๋„์›€์ด ๋˜๋„๋ก ๋…ธ๋ ฅ):

  • Span<T> ๋Š” NetStandard2 ์— ์—†์Šต๋‹ˆ๋‹ค.
  • "Nonce"๋Š” ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. GCM์˜ ๋ƒ„์ƒˆ. ๊ทธ๋Ÿฌ๋‚˜ GCM ๋ฌธ์„œ(์˜ˆ: NIST SP800-38D)์—์„œ๋„ ์ด๋ฅผ "IV"๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ด๋Š” GCM์˜ ๊ฒฝ์šฐ ์ž„์‹œ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ AEAD ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ IV๋Š” nonce์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: CBC+HMAC์—์„œ IV๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์€ ์žฌ์•™์ด ์•„๋‹™๋‹ˆ๋‹ค).
  • ์ŠคํŠธ๋ฆฌ๋ฐ AEAD๋Š” CryptoStream ๊ณผ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ CryptoStream๋งŒํผ ์‰ฝ๊ฒŒ ์ŠคํŠธ๋ฆฌ๋ฐ ์ธ/์•„์›ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด "AEADCryptoStream"์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • AEAD API ๊ตฌํ˜„์€ AAD(๊ด€๋ จ ๋ฐ์ดํ„ฐ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‚ด๋ถ€ ํ‚ค ํŒŒ์ƒ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ „ํžˆ ํƒœ๊ทธ ๊ณ„์‚ฐ/๊ฒ€์ฆ์„ ์œ„ํ•ด AAD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์ œํ•œ์ ์ด๋ฉฐ ๋” ๊ฐ•๋ ฅํ•œ AEAD ๋ชจ๋ธ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • "Get*" ๋ฉ”์„œ๋“œ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(GetTag). void์ธ ๊ฒฝ์šฐ ๋ฌด์–ธ๊ฐ€๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • "๋งˆ๋ฌด๋ฆฌ"ํ•˜๊ธฐ ์ „์— ํƒœ๊ทธ๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋‚˜์œ ์ƒ๊ฐ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ "IsFinished"๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ICryptoTransform ์„ ์„ค๊ณ„ํ•œ ์‚ฌ๋žŒ๋“ค์€ ์žฌ์‚ฌ์šฉ, ๋‹ค์ค‘ ๋ธ”๋ก ์ง€์› ๋ฐ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ์ž…๋ ฅ/์ถœ๋ ฅ ๋ธ”๋ก ํฌ๊ธฐ์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์šฐ๋ ค๋Š” ํฌ์ฐฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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๋Š” ๋ชจ๋‘ ๋‹ค๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(์ฃผ์ œ ํ”ผ๋“œ๋ฐฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ข‹๋“  ๋‚˜์˜๋“  ํ•ญ์ƒ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค! )

  • ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค?
  • ํ˜„์žฌ SymmetricAlgorithm ํด๋ž˜์Šค๊ฐ€ ์ด ํด๋ž˜์Šค์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๊นŒ?
  • TripleDESCng ๋ฐ AesCng๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ง€์†ํ˜• ํ‚ค์— ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?
  • ์ด๋Ÿฌํ•œ Span ์ค‘ ๋Œ€๋ถ€๋ถ„์€ ReadOnlySpan์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@Drawaes ์ด API์—์„œ ๊ณต์„ ๊ตด๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ:

  1. ํƒœ๊ทธ๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๋ชฉ์ ์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํƒœ๊ทธ ์ƒ์„ฑ ๋ฐ ํ™•์ธ์€ ์ด API์˜ ๋งค์šฐ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ดˆ๊ธฐํ™” ๋ฐ ์™„๋ฃŒ ์ž‘์—…์— ํƒœ๊ทธ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์‹ค์ˆ˜๋กœ ๋ฌด์‹œ๋˜๋Š” ์ผ์ด ์—†๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•”ํ˜ธํ™” ๋ฐ ์•”ํ˜ธ ํ•ด๋…์ด ๋™์ผํ•œ ์ดˆ๊ธฐํ™” ๋ฐ ์ข…๋ฃŒ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  2. ํƒœ๊ทธ๊ฐ€ ํ™•์ธ๋  ๋•Œ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—(๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ) ์•”ํ˜ธ ํ•ด๋… ์ค‘์— ๋ธ”๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋งŒ๊ฐ์ด ๊ต์ฐจํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์ ˆ์ถฉ์•ˆ์„ ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ํ‰๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฆฌ์…‹์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋ฆฌ์…‹๋งŒ ํ•˜๋ฉด ๋์ธ๊ฐ€์š”? ์ฆ๋ถ„ ํ•ด์‹œ์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ƒˆ IV๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ).

@bartonjs

  1. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” BCL์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ ๋Š” ๋‚˜์ค‘์— ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ‰์ƒ ๊ฐ•์•„์ง€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค... ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐฉ๋ฒ•์ด ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์—†๋‹ค๋ฉด.
    ๋˜ํ•œ ์ถ”์ƒ ์œ ํ˜•์˜ ๋ด‰์ธ๋œ ํด๋ž˜์Šค๋Š” ์‹ค์ œ๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค(ํ˜„์žฌ๋กœ์„œ๋Š”) jitt๊ฐ€ ์ด์ œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ƒํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค... ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๋””์ŠคํŒจ์น˜๊ฐ€ ์ข‹์ง€ ์•Š์Œ(์—ฌ์ „ํžˆ ์ข‹์ง€ ์•Š์Œ)
  2. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ? ํ˜„์žฌ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ๊ด€์‹ฌ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•ฉ๋ฆฌ์ ์ธ ์ตœ์‹  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ”๋กœ ํŒจ์น˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(3DES๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๋‚จ๊ฒจ๋‘์„ธ์š”. :) ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋‹ต์„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•˜์‹ค ์ƒ๊ฐ์ด ์žˆ์œผ์‹ ๊ฐ€์š”?
  3. ์˜๊ตฌ ํ‚ค๋Š” ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ๋ฉ”์„œ๋“œ ๋˜๋Š” ์ง€์†์„ฑ ์ €์žฅ์†Œ์— ํ™•์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
MyKeyStore.GetCipher();

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ผํšŒ์šฉ์ด๋ฏ€๋กœ ์ผ๋ฐ˜ ์ผํšŒ์šฉ ํŒจํ„ด์œผ๋กœ ๋ชจ๋“  ์‹ฌํŒ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž˜๋ชป๋œ ์ž‘์—… ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•ด์„œ๋Š” ํœด๋Œ€์ „ํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์กฐ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@morganbr ๋ฌธ์ œ์—†์–ด์š”... ๋ฌด์—‡๋ณด๋‹ค ๊ทธ๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜๊ธธ ๋ฐ”๋ž„ ๋ฟ์ž…๋‹ˆ๋‹ค ;)

  1. ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ๋ช…ํ™•์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ถˆํ–‰ํ•œ ์ผ์ด์ง€๋งŒ ๋ธ”๋ก์„ ์ผ์ฐ ๋ฑ‰์–ด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. hmac ๋ฐ ํ•ด์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์ง€๋งŒ ์ƒํƒœ๋งŒ ์ž„์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ์•Œ ์ˆ˜ ์—†๋Š” ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ ์˜ˆ์ œ์™€ TLS๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 16k์˜ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํŒŒ์ดํ”„๋ผ์ธ ๋ฒ„ํผ๋Š” ์˜ค๋Š˜๋‚  4k ํŽ˜์ด์ง€ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐ๊ปํ•ด์•ผ 4*4k๋ฅผ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ ๋ชจ๋“  ๊ฒƒ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•˜๊ณ  ๋‚ด๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์„ ๋•Œ ๊ทธ๊ฒƒ์„ ๋ฒ„๋ฆด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ฆ์•„์ค„๊นŒ? ๋‚ด๊ฐ€ 10MB๋ฅผ ํ•ด๋…ํ•˜๊ณ  ์ž ์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•ด์•ผ ํ•˜๋Š” ํ›„์— ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?
  3. ์ดˆ๊ธฐํ™”/์žฌ์„ค์ •์— ๋Œ€ํ•ด 100%๋Š” ์•„๋‹ˆ์ง€๋งŒ(๋‹น์‹ ์˜ ์•„์ด๋””์–ด, ํ˜„์žฌ API ๋ชจ์–‘์ด ์•„๋‹˜) ๊ทธ๊ฒƒ์€ ๋‚˜์™€ ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์ œ์•ˆ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค!

ํ˜„์žฌ ๋‚ด์šฉ์—๋Š” ๊ด€์‹ฌ์ด ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ ๋ชจ๋“  ํ•ฉ๋ฆฌ์ ์ธ ์ตœ์‹  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ”๋กœ ํŒจ์น˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(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 ์ €๋Š” ์ƒ๊ฐ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ •์  ๋ฉ”์„œ๋“œ/ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‚˜๋Š” ๋ฌด์—‡์ด ์˜ฌ์ง€ ๋ชจ๋ฅด๋‚˜ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค - ๊ทธ๊ฒƒ์€ NetStandard2์— ์—†๊ณ , ์ง„์ง€ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ .NET์—๋„ ์—†๋‹ค(์˜ˆ, ์˜ˆ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Core์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Core๋Š” ์žฅ๋‚œ๊ฐ์ž…๋‹ˆ๋‹ค) ์ง€๊ธˆ์€). ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Span์„ ๊ณ ๋ คํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ณผ ๋•Œ - ๊ทธ๋•Œ๊นŒ์ง€ ArraySegment์‹ค์ œ๋กœ ์ œ๊ณต๋˜๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด NetStandard API์ž…๋‹ˆ๋‹ค.

์œ ์šฉํ•œ 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์— ๋Œ€ํ•œ ์ตœ๊ทผ ํ† ๋ก ์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์ปค์ง€๋ฉด ๋ฉ”์ธ ์˜ค๋ธŒ์ ํŠธ์— ๋งŽ์€ ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฉด ์—‰๋ง์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์›์น™์ ์œผ๋กœ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ผ์ด ๋‚˜์—๊ฒŒ ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์ œ์•ˆ์€ TagSize out ๊ฐ’(๊ธ€์Ž„, get-only-property)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ GCM๊ณผ CCM ๋ชจ๋‘ ์•”ํ˜ธํ™”์— ๋Œ€ํ•œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค(์‹ค์ œ ํƒœ๊ทธ๋ฅผ ์ œ๊ณตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•”ํ˜ธ ํ•ด๋…์—์„œ ํŒŒ์ƒ ๊ฐ€๋Šฅ).
  • ์ œ์•ˆ์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ๋™์‹œ์— ๋‹จํŽธ์ ์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

    • IIRC CCM์€ ์ŠคํŠธ๋ฆฌ๋ฐ ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜ ํ…์ŠคํŠธ์˜ ๊ธธ์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค).

    • ํŒจ๋”ฉ ๋ชจ๋“œ๋Š” Final์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๋Š”์ง€/ํ˜„์žฌ ๋ธ”๋ก์—์„œ ํŒจ๋”ฉ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— (์ตœ์†Œํ•œ ํ•˜๋‚˜) ๋ธ”๋ก๋งŒํผ ํ•ด๋…์ด ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค.

  • ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ AD ์š”์†Œ๊ฐ€ ์ž‘์—… ์‹œ์ž‘ ์‹œ ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜์—ฌ ํ›„๊ธฐ ๋ฐ”์ธ๋”ฉ๋œ ์—ฐ๊ฒฐ๋ณด๋‹ค Init/ctor ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋” ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ํ˜•์‹(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 ECB๋Š” nonce ๋˜๋Š” IV๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • AES GCM์—๋Š” ์žฌ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” 96๋น„ํŠธ ์ž„์‹œ๊ฐ’์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํ‚ค์˜ ๋ณด์•ˆ์ด ๊นจ์ง‘๋‹ˆ๋‹ค. nonce๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ ๋‚ฎ์€ ์—”ํŠธ๋กœํ”ผ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
  • AES CBC์—๋Š” ๋ฌด์ž‘์œ„์—ฌ์•ผ ํ•˜๋Š” 128๋น„ํŠธ IV๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. IV๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉด ์ด์ „์— ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋งŒ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • AES SIV๋Š” ๋‹ค๋ฅธ ์ž…๋ ฅ์—์„œ ํŒŒ์ƒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์  IV๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋ธ”๋ก์— ๋Œ€ํ•ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.highlighted

์ „ ์„ธ๊ณ„์˜ ๋ฐˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ €ํ•ญ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค :)
Can't resist

๋˜ํ•œ 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
}
  1. ์ผ๋ฐ˜์ ์œผ๋กœ AAD << ์ผ๋ฐ˜ ํ…์ŠคํŠธ์ด๋ฏ€๋กœ ์ „์ฒด AAD๊ฐ€ ๋ฒ„ํผ๋กœ ์ „๋‹ฌ๋œ ๋‹ค์Œ ์•”ํ˜ธ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ+ ์ŠคํŠธ๋ฆผ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” cipher.Init(mykey, nonce, aad); ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. (์˜ˆ: BCryptEncrypts์˜ CipherModeInfo ๋งค๊ฐœ๋ณ€์ˆ˜ ). ๋˜ํ•œ myKey์˜ ํฌ๊ธฐ๋Š” ์ด๋ฏธ AES128, 192, 256์„ ์„ค์ •ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ํ˜ธ์ถœ์ž๊ฐ€ ๊ธฐ์กด ํด๋ž˜์Šค, ๊ธฐ์กด AES ์ƒ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  AES ํ‚ค๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ AES ํ•˜์œ„ ํ‚ค ์ƒ์„ฑ์„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ Init๋Š” ์„ ํƒ์  API๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  3. cipher์˜ API๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์•”ํ˜ธํ™” API ๋˜๋Š” ๊ธฐ์กด .NET API์™€ ๊ฐ™์€ ๋ธ”๋ก ํฌ๊ธฐ ๊ด€๋ฆฌ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ์ž๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ตœ์ ํ™”๋œ ๋ฒ„ํผ ํฌ๊ธฐ์™€ ๊ด€๋ จ๋œ ํ˜ธ์ถœ์ž(์˜ˆ: 16K+ ๋ฒ„ํผ๋ฅผ ํ†ตํ•œ ๋„คํŠธ์›Œํฌ IO). ๊ตฌํ˜„ ๊ฐ€์ •์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด 16K๋ณด๋‹ค ํฐ ์†Œ์ˆ˜๋กœ ๋ฐ๋ชจ
  4. inputSpan์€ ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ outSpan์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
  5. Update()๋Š” ์•”ํ˜ธํ™” ๋˜๋Š” ์•”ํ˜ธ ํ•ด๋…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ? ๊ฐœ๋ฐœ์ž์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์•”ํ˜ธํ™” ๋ฐ ์•”ํ˜ธ ํ•ด๋… ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 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์™€ ์œ ์‚ฌ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์ : AES-GCM/CCM์— ์ ํ•ฉ, ์ข‹์€ ์†Œ์Šค(NIST, RFC)์˜ ๊ธฐ์กด ํ…Œ์ŠคํŠธ ๋ฒกํ„ฐ. @sidshety ๋Š” ํ–‰๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @blowdart ๋Š” _"ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๋งค์šฐ ์›์‹œ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ"_์— ๋Œ€ํ•ด ๋ช…์ƒํ•˜์ง€๋งŒ, ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” ์›์‹œ์ ์ด๋ฉฐ ์–ด๋ฆฐ์ด๋ฅผ ๋ณดํ˜ธํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ์—๋Š” ์Œ๊ณผ ์–‘์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‹จ์ : ์ „๋ฌธ๊ฐ€ ์‚ฌ์šฉ์ž(์†๋‹ด์˜ 1%)๋Š” ์ €์ˆ˜์ค€ API๋ฅผ ์ฑ…์ž„๊ฐ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜๋ฉด, ๋‹ค๋ฅธ ๋น„์ „๋ฌธ๊ฐ€ ์‚ฌ์šฉ์ž(99%)๋Š” ์ด API๋ฅผ ์˜ค์šฉํ•˜์—ฌ ๋Œ€๋‹ค์ˆ˜์˜ .NET์„ ๋‹ด๋‹นํ•˜๋Š” ์†์ƒ๋œ .NET ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. CVE๋Š” .NET์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ”Œ๋žซํผ์ด๋ผ๋Š” ์ธ์‹์— ํฌ๊ฒŒ ๊ธฐ์—ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ์˜ค์šฉ ๋ถˆ๊ฐ€๋Šฅ ๋˜๋Š” ๋‚ด์„ฑ AEAD API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์ : ๋น„์ „๋ฌธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ 99%๋Š” ๊ณ„์†ํ•ด์„œ ์‹ค์ˆ˜๋ฅผ ํ•˜๊ฒ ์ง€๋งŒ ์ ์–ด๋„ AEAD ์ฝ”๋“œ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @blowdart ์˜ _"๊ธฐ๋ณธ์ ์œผ๋กœ API๊ฐ€ ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค."_ ์ƒํƒœ๊ณ„์— ๊นŠ์ด ๋ฐ˜ํ–ฅ์„ ์ผ์œผํ‚ค๋ฉฐ ๋ณด์•ˆ, ๋ฒˆ์˜ ๋ฐ ์ข‹์€ ์—…๋ณด๊ฐ€ ๋ชจ๋‘ ๋‹ฅ์นฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์ข‹์€ API ๋””์ž์ธ ๋ฐ ๊ตฌํ˜„์ด ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ : ํ‘œ์ค€์ด ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋ฒกํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. AEAD๊ฐ€ ๋†’์€ ์ˆ˜์ค€์˜ ์˜จ๋ผ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ API๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ชฉํ‘œ์ธ์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์Šคํฌ์ผ๋Ÿฌ: ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rogaway์˜ ๋…ผ๋ฌธ ์ฐธ์กฐ).

์•„๋‹ˆ๋ฉด ๋‘˜ ๋‹ค ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋ถ„์„ ๋งˆ๋น„ ์ƒํƒœ๊ฐ€ ๋˜์–ด ์ง€๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์–ธ์–ด์˜ ์ผ๋ถ€์ธ ์•”ํ˜ธํ™”์—๋Š” ๊ฒฌ๊ณ ํ•˜๊ณ  ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ธฐ๋ณธ 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
{
์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„GetNextNonce(int nonceSize);
}

๊ณต๊ฐœ ์ถ”์ƒ ํด๋ž˜์Šค AuthenticatedEncryptor : IDisposable
{
๊ณต๊ฐœ int NonceOrIVSizeInBits { ๊ฐ€์ ธ์˜ค๊ธฐ; }
๊ณต๊ฐœ int TagSizeInBits { ๊ฐ€์ ธ์˜ค๊ธฐ; }
๊ณต๊ฐœ ๋ถ€์šธ SupportsAssociatedData { ๊ฐ€์ ธ์˜ค๊ธฐ; }
๊ณต๊ฐœ ์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„LastNonceOrIV { ๊ฐ€์ ธ์˜ค๊ธฐ; }
๊ณต๊ฐœ ์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„LastTag { ๊ฐ€์ ธ์˜ค๊ธฐ; }

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ํ‚ค ํฌ๊ธฐ, INonceProvider nonnceProvider)
: ๊ธฐ๋ณธ(128, ์ฐธ, 96)
{
}
}

๊ณต๊ฐœ ๋ด‰์ธ ํด๋ž˜์Šค AesCcmEncryptor : AuthenticatedEncryptor
{
๊ณต๊ฐœ AesCcmEncryptor(
์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„์—ด์‡ ,
์ •์ˆ˜ nonceSizeInBits,
INonceProvider nonceProvider,
int tagSizeInBits)
: ๊ธฐ๋ณธ(tagSizeInBits, true, nonceSizeInBits)
{
์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์–‘์— ๋Œ€ํ•ด nonceSize ๋ฐ tagSize๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
}
}

๊ณต๊ฐœ ์ถ”์ƒ ํด๋ž˜์Šค AuthenticatedDecryptor : IDisposable
{
๊ณต๊ฐœ ์ถ”์ƒ bool TryDecrypt(
์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„๊ผฌ๋ฆฌํ‘œ,
์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„nonceOrIV,
์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ,
์ฝ๊ธฐ ์ „์šฉ ๋ฒ”์œ„์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ,
๊ธฐ๊ฐ„๋ฐ์ดํ„ฐ,
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ํ‚ค) => null ๋˜์ง€๊ธฐ;
}

๊ณต๊ฐœ ๋ด‰์ธ ํด๋ž˜์Šค AesCcmDecryptor : AuthenticatedDecryptor
{
๊ณต๊ฐœ AesCcmDecryptor(ReadOnlySpanํ‚ค) => null ๋˜์ง€๊ธฐ;
}
```

์ด ์ œ์•ˆ์€ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์ ์—์„œ ์œ ์—ฐ์„ฑ์ด ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์œ„ํ—˜(GCM์˜ ๊ฒฝ์šฐ ๋งค์šฐ ๋†’์Œ) ๋˜๋Š” ๋ถˆ๊ฐ€๋Šฅ(CCM)๊ณผ ๊ฒฐํ•ฉ๋œ ์‹ค์ œ ์š”๊ตฌ ์‚ฌํ•ญ(๋‚ฎ์Œ)์€ ์ด์ œ ๋ง‰ ์‚ฌ๋ผ์กŒ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ์™ธ๋ถ€ํ™”๋œ nonce ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณต๊ฐœ ๊ตฌํ˜„์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/ํ”„๋กœํ† ์ฝœ์€ ์ปจํ…์ŠคํŠธ์— ํ‚ค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ ์ ˆํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. TryEncrypt์— ๋Œ€ํ•œ ๊ฐ ํ˜ธ์ถœ์€ GetNextNonce์— ๋Œ€ํ•œ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜์ง€๋งŒ ํŠน์ • TryEncrypt๊ฐ€ ์„ฑ๊ณตํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด nonce๋ฅผ ๋‹ค์‹œ ์‹œ๋„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ธ์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. CBC+HMAC์˜ ๊ฒฝ์šฐ ์šฉ์–ด๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก IIVProvider๋ผ๋Š” ์ƒˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. SIV์˜ ๊ฒฝ์šฐ IV๊ฐ€ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ ํ—ˆ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์–‘์— ๋”ฐ๋ผ nonce(์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ)๋Š” relatedData์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ SIV๋Š” ์ตœ์†Œํ•œ nonceOrIV๋ฅผ TryEncrypt์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

TryDecrypt๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•˜๊ฒŒ ์ž˜๋ชป๋œ ํƒœ๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋Œ€์ƒ์ด ๋„ˆ๋ฌด ์ž‘์€ ๊ฒฝ์šฐ์—๋งŒ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(Try-method์˜ ๊ทœ์น™์— ๋”ฐ๋ผ).

ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด ํ™•์‹คํžˆ ์—ด๋ ค ์žˆ๋Š” ๊ฒƒ๋“ค:

  • ํฌ๊ธฐ๋Š” ๋น„ํŠธ(์‚ฌ์–‘์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๊ณผ ๊ฐ™์ด) ๋˜๋Š” ๋ฐ”์ดํŠธ(์–ด์จŒ๋“  %8 ๊ฐ’๋งŒ ํ•ฉ๋ฒ•์ ์ด๋ฏ€๋กœ ํ•ญ์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์–‘์˜ ์ผ๋ถ€๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„์˜ nonce ํฌ๊ธฐ์™€ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—)์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. )?
  • ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฐ ์ˆœ์„œ.
  • LastTag/LastNonceOrIV ์†์„ฑ์ž…๋‹ˆ๋‹ค. (๊ณต๊ฐœ TryEncrypt์˜ ์ŠคํŒฌ์„ (์“ฐ๊ธฐ ๊ฐ€๋Šฅ)์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ "Try"๊ฐ€ ๋” ๋ช…ํ™•ํ•œ ์ชฝ์— ์•‰๊ฒŒ ํ•จ์œผ๋กœ์จ ๋„ˆ๋ฌด ์ž‘์„ ์ˆ˜ ์žˆ๋Š” ์„ธ ๊ฐœ์˜ ๋ฒ„ํผ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์งง์€ ๋ฒ„ํผ๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.).
  • ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” AE ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • associatedData ๋ฅผ ๊ธฐ๋ณธ๊ฐ’ ReadOnlySpan<byte>.Empty ์œผ๋กœ ๋๊นŒ์ง€ ์ด๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

    • ์•„๋‹ˆ๋ฉด ๊ทธ๊ฒƒ์„ ์ƒ๋žตํ•˜๋Š” ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๊นŒ?

  • byte[] -returning ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์‚ฌ๋ž‘์ด๋‚˜ ์ฆ์˜ค๋ฅผ ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (๋‚ฎ์€ ํ• ๋‹น์€ Span ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ง€ ํŽธ์˜๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค)
  • ํฌ๊ธฐ ๋ฒ”์œ„ ๋ฐฉ๋ฒ•์€ ๊ฒฐ๊ตญ ๋ณผํŠธ๋กœ ๊ณ ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    • ๊ทธ๋“ค์˜ ๋ชฉ์ ์€

    • ๋Œ€์ƒ ๋ฒ”์œ„๊ฐ€ min๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ฆ‰์‹œ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • byte[] -returning ๋ฉ”์†Œ๋“œ๋Š” ์ตœ๋Œ€ ๋ฒ„ํผ๋ฅผ ํ• ๋‹นํ•œ ๋‹ค์Œ ํ•„์š”์— ๋”ฐ๋ผ Array.Resizeํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ, GCM ๋ฐ CCM 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๊ณผ ๊ฐ™์€ ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๊ฐ•์ œ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ทผ๊ฑฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ท€ํ•˜์˜ ์•”ํ˜ธํ™”ํ ์œ„์›ํšŒ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฒ€ํ† ํ•œ ์ด ๋‘ ๊ฐ€์ง€ ์ตœ๊ทผ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฌด์—‡์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๊นŒ?

  1. ํด๋ผ์ด์–ธํŠธ์—๋Š” 10-30GB ์‚ฌ์ด์˜ ๋Œ€์šฉ๋Ÿ‰ ์˜๋ฃŒ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”์–ด๋Š” ๋‘ ์‹œ์Šคํ…œ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋‚˜์˜ ํŒจ์Šค ์ŠคํŠธ๋ฆผ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ฐ 10GB ํŒŒ์ผ์— ๋Œ€ํ•ด ์ƒˆ ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์›Œํฌํ”Œ๋กœ๋ฅผ ์“ธ๋ชจ์—†๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ a) ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๋ง(๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ดํ”„๋ผ์ธ ์—†์Œ) b) ์•”ํ˜ธํ™” ์ˆ˜ํ–‰(ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ชจ๋“  ์‹œ์Šคํ…œ์€ ์ด์ œ ์œ ํœด ์ƒํƒœ์ž…๋‹ˆ๋‹ค!) c) ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ(๋ฐ b ๋‹ค์Œ์— ์ž‘์„ฑ๋œ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” 100%์ž„) ์™„๋ฃŒ) ? ๋†๋‹ด์ด๋ผ๊ณ  ๋งํ•ด์ฃผ์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์€ ๊ณ ์˜๋กœ "์•”ํ˜ธํ™”๋Š” ๋ถ€๋‹ด์ž…๋‹ˆ๋‹ค"๋ฅผ ๊ฒŒ์ž„์— ๋‹ค์‹œ ์ง‘์–ด๋„ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋ฌผ๋ฆฌ์  ๋ณด์•ˆ ์žฅ์น˜์—๋Š” ๋ฏธ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ์•”ํ˜ธํ™”๋˜๋Š” ์—ฌ๋Ÿฌ 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๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
...

  1. 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์—๊ฒŒ ์‚ฌ๋ž‘์„ ์ฃผ์„ธ์š” :)

๋‚ด ๊ด€์ ์—์„œ ์•”ํ˜ธํ™” ๊ธฐ๋ณธ ์š”์†Œ์˜ ์œ ์ผํ•œ ๋ชฉ์ ์€ ์ž˜ ์„ค๊ณ„๋œ ๊ณ ๊ธ‰ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ”„๋กœํ† ์ฝœ์€ ๊ณ ์œ ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž„์‹œ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • TLS 1.2๋Š” RFC 5116์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋”ฐ๋ฅด๊ณ  4๋ฐ”์ดํŠธ IV๋ฅผ 8๋ฐ”์ดํŠธ ์นด์šดํ„ฐ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • TLS 1.3 xor๋Š” 12๋ฐ”์ดํŠธ IV๋กœ 12๋ฐ”์ดํŠธ๋กœ ์ฑ„์›Œ์ง„ 8๋ฐ”์ดํŠธ ์นด์šดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • ๋…ธ์ด์ฆˆ๋Š” AES-GCM์— ๋Œ€ํ•ด ๋น…์—”๋””์•ˆ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋กœ 12๋ฐ”์ดํŠธ ๋กœ ํŒจ๋”ฉ๋œ 8๋ฐ”์ดํŠธ ์นด์šดํ„ฐ์™€ ChaCha/Poly์— ๋Œ€ํ•ด ๋ฆฌํ‹€์—”๋””์•ˆ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋กœ 12๋ฐ”์ดํŠธ๋กœ ํŒจ๋”ฉ๋œ 8๋ฐ”์ดํŠธ ์นด์šดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

GCM์€ ์ผ๋ฐ˜์ ์ธ nonce ํฌ๊ธฐ(96๋น„ํŠธ)์—์„œ ์ž„์˜ nonce์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๋ฌด์ž‘์œ„ nonce๋ฅผ ์ง€์›ํ•˜๋Š” ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋” ๋งŽ์€ API์— ๋Œ€ํ•œ ์ˆ˜์š”๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 99.9%์˜ ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•”ํ˜ธ ์ €์žฅ, ์ €์žฅ ํŒŒ์ผ ์•”ํ˜ธํ™”, ์†Œํ”„ํŠธ์›จ์–ด ์—…๋ฐ์ดํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๋Š” ๋“ฑ ๋ณด์•ˆ ๊ด€๋ จ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•œ ๊ณ ๊ธ‰ ๋ ˆ์‹œํ”ผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๋ ˆ์‹œํ”ผ๋ฅผ ์œ„ํ•œ API๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ API๋Š” ์ข…์ข… HTTPS์™€ ์•”ํ˜ธํ™” ๊ธฐ๋ณธ ์š”์†Œ๋ฟ์ด๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ์ž์ฒด ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. IMO ์†”๋ฃจ์…˜์€ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์ž‘์—…์„ ์œ„ํ•œ API ์„ค๊ณ„์— ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ๋ ˆ์‹œํ”ผ์šฉ API์ž…๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„! ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ:

  1. ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณตํ˜ธํ™”๋Š” ์น˜๋ช…์ ์œผ๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ŠคํŠธ๋ฆฌ๋ฐ ์•”ํ˜ธํ™”๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์•”ํ˜ธํ™”(๋น„ ์ŠคํŠธ๋ฆฌ๋ฐ ์˜ต์…˜๊ณผ ํ•จ๊ป˜)๊ฐ€ ์žˆ์ง€๋งŒ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์•„๋‹Œ ์•”ํ˜ธ ํ•ด๋…๋งŒ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    ใ…. ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜(CCM, SIV)์€ ์‹ค์ œ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ์ŠคํŠธ๋ฆฌ๋ฐ ์•”ํ˜ธํ™”๋ฅผ ์ ์šฉํ•˜๊ณ  ์ŠคํŠธ๋ฆฌ๋ฐ๋œ ์ž…๋ ฅ์„ ๋ฒ„ํผ๋งํ•ด์•ผ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ๋˜์ ธ์•ผ ํ•˜๋‚˜์š”?
    ๋น„. ์ŠคํŠธ๋ฆฌ๋ฐ AAD๋Š” ๊ตฌํ˜„ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์ด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค(์ผ๋ถ€๋Š” ์ฒ˜์Œ์— ํ•„์š”ํ•˜๊ณ  ์ผ๋ถ€๋Š” ๋๋‚  ๋•Œ๊นŒ์ง€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ). ๋ฏธ๋ฆฌ ์š”๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ฐœ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ—ˆ์šฉํ•  ๋•Œ ์ž‘๋™ํ•˜๋Š” ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
  1. ์‚ฌ์šฉ์ž๊ฐ€ ์ƒˆ nonce๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋งŒ ๊ณ ๋ คํ•˜๋ฉด INonceProvider๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ œ์•ˆํ•œ ๋ชจ์–‘์ด ์žˆ์Šต๋‹ˆ๊นŒ?

1 . = ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ 10GB ํŒŒ์ผ๋กœ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๋ฐ›๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‚˜์ค‘์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•”ํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— 10GB๋ฅผ ๋ฒ„ํผ๋ง(๋˜๋Š” ์‹œ๋„)ํ•ฉ๋‹ˆ๋‹ค.

  1. b = ๋‹ค์‹œ "์ŠคํŠธ๋ฆฌ๋ฐ" ๋˜๋Š” ๋„คํŠธ์›Œํ‚น ์•„์ด๋””์–ด(์˜ˆ: AES GCM ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•”ํ˜ธ ํ•ด๋…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ AAD ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”์— ๊ด€ํ•ด์„œ๋Š” ์•„์ง ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ ์–ด๋„ ์•”ํ˜ธํ™”์˜ ๊ฒฝ์šฐ ์‹œ์ž‘ ์‹œ ์š”๊ตฌํ•ด์•ผ ํ•˜๋ฉฐ ์•”ํ˜ธ ํ•ด๋…์€ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
  1. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด nonce์— "๋ฐ”์ดํŠธ"๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์ง์ ‘์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ™์€ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์‹œ์ธ์—๊ฒŒ๋Š” ๋” ๋ชป์ƒ๊ฒผ์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ๋ฐค์— ๋” ์ž˜ ์ž๊ฒŒ ํ•ด์ค€๋‹ค๋ฉด ๊ฒฉ๋ ฌํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์™„๋ฃŒ๋œ ๊ฑฐ๋ž˜๋กœ ์ทจ์†Œํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ฌ์˜ ๊ณผ์ •์— ๋Œ€ํ•ด

@bartonjs : ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฐธ์—ฌ๊ฐ€ ์—†๋Š” ๋น„๊ณต๊ฐœ ๊ฒฐ์ •์ด ํšจ๊ณผ์ ์ธ ์ •๋‹นํ™”๋ผ๋ฉด ํ•˜๋ฃจ ์ข…์ผ ๋…ผ์Ÿ์„ ๋ฒŒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋” ํ’๋ถ€ํ•œ ๋Œ€๋ฉด์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ณณ์—์„œ ๋ˆ„๊ตฌ๋ฅผ ํ™”๋‚˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ์— ๊ด€ํ•˜์—ฌ

1. '์ŠคํŠธ๋ฆฌ๋ฐ์€ AES-GCM ๋ณด์•ˆ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Œ' ์ธ์ˆ˜

ํŠนํžˆ ์Šคํ‹ฐ๋ฐ => ํƒœ๊ทธ ํ™•์ธ ์ „์— ๋ณตํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ => ๋ณด์•ˆ ์—†์Œ. ์ด๊ฒƒ์€ ์†Œ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. @bartonjs ๋Š” '์„ ํƒ๋œ ์•”ํ˜ธ๋ฌธ => ์ถœ๋ ฅ ๋ณด๊ธฐ => ํ‚ค ๋ณต๊ตฌ'๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๋ฐ˜๋ฉด @drawaes ๋Š” '๋ธ”๋ก์— ๋Œ€ํ•œ ์ œ์–ด ์ž…๋ ฅ => ๋”ฐ๋ผ์„œ ์ถœ๋ ฅ์„ ์•Œ๊ณ  ์žˆ์Œ => "๊ฑฐ๊ธฐ์—์„œ ์ž‘์—…"'์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, AES-GCM์—์„œ ํƒœ๊ทธ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ(๋ณ€์กฐ ๋ฐฉ์ง€) ๋ฟ์ž…๋‹ˆ๋‹ค . ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์— 0 ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ AES-GCM์—์„œ GCM/GHASH ํƒœ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋‹จ์ˆœํžˆ AES-CTR ๋ชจ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋ฒ„์‹œ ์ธก๋ฉด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  CTR์€ ๋น„ํŠธ ํ”Œ๋ฆฝ์— ์œ ์—ฐํ•˜์ง€๋งŒ ๊ธฐ๋ณธ AES ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์†์ƒ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์‚ฌ๋žŒ์ด ์ฃผ์žฅํ•˜๋Š” ๋ฐฉ์‹(ํ‚ค ๋˜๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ณต๊ตฌ)์—์„œ "๊นจ์ง€์ง€" ์•Š์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ ๋ถ„์„๊ฐ€(๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ?)๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ/๊ทธ๋…€๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ฒŒ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๊ฒƒ์€ ๊ณต๊ฒฉ๋ฐ›์€ ์‚ฌ๋žŒ์ด ๋น„ํŠธ N์„ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ์˜ ๋น„ํŠธ N์ด ๋’ค์ง‘ํ˜”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ๊ฒฐ์ฝ” ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ

1) ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ํ•ญ์ƒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
2) ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ์€ ๋‹จ์ˆœํžˆ ์—ฐ๊ธฐ๋˜๊ณ (์ŠคํŠธ๋ฆผ์ด ๋๋‚  ๋•Œ๊นŒ์ง€)
3) ์–ด๋– ํ•œ ํ‚ค๋„ ์†์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ์ด ๊ธฐ๋ณธ์ธ ์ œํ’ˆ ๋ฐ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ์ด์ œ AEAD์—์„œ ์ผ๋ฐ˜ AES ์•”ํ˜ธํ™”๋กœ ์ผ์‹œ์ ์œผ๋กœ ๋‹จ๊ณ„๋ฅผ ๋‚ฎ์ถ”๊ณ  ํƒœ๊ทธ ํ™•์ธ ์‹œ ๋‹ค์‹œ AEAD๋กœ ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐ€๋Š” ์ ˆ์ถฉ์•ˆ์„ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ฒ„ํผ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๋ฏธ์ณค์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์•”ํ˜ธํ™”๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!"๋ผ๊ณ  ๋งํ•˜๋Š” ๋Œ€์‹  ๋ณด์•ˆ์„ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ˜์‹ ์ ์ธ ๊ฐœ๋…์„ ์ž ๊ธˆ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘ Encrypt ๋ฐ EncryptFinal (๋˜๋Š” ์ด์— ์ƒ์‘ํ•˜๋Š” ๊ฒƒ)๊ฐ€ ์•„๋‹Œ EncryptFinal ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2. GCM์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

์ด์ œ 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๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ๋ง์ด ๊ธฐ์ˆ ์ ์œผ๋กœ ๋น„์‹ค์šฉ์ ์ผ ๊ฒฝ์šฐ ๊ฑด์ถ•๊ฐ€๋Š” ์ตœ์†Œํ•œ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ "๋ฌด๊ด€์‹ฌ"์ด ์•„๋‹Œ "๋“œ๋ก  ์˜์ƒ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์Œ"์„ ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ ์ค‘ ์ตœ๊ณ ์•ผ

๋ฐ์ดํ„ฐ๋Š” ์ ์  ๋” ์ปค์ง€๊ณ  ๋ณด์•ˆ์€ ๋” ๊ฐ•๋ ฅํ•ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ์€ ๋””์ž์ด๋„ˆ๊ฐ€ ์ˆ˜์šฉํ•ด์•ผ ํ•˜๋Š” ํ˜„์‹ค์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ „ ์„ธ๊ณ„๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ€ํŒจ ์ค‘๊ฐ„ ๋ณ€์กฐ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ง„์ •์œผ๋กœ ํ†ตํ•ฉ๋œ AEAD ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“ค ๋•Œ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์นœ๊ตฌ์ฒ˜๋Ÿผ ์•”ํ˜ธํ™” + ์ธ์ฆ์„ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง„์ •ํ•œ AEAD ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๊ฐ€ ์—ฐ๊ตฌ๋˜๊ณ  ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์•”ํ˜ธํ™” + ์ธ์ฆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๋น ๋ฅด๊ณ  ์ธ๊ธฐ ์žˆ๋Š” AEAD ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๋งŒํผ "AES-GCM"์—๋Š” ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

4. AES-CBC-HMAC ์‚ฌ์šฉ, ์‚ฌ์šฉ(ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์‚ฝ์ž…)

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

๋‚˜๋Š” ๊ณง ๊ทธ๋Ÿฌ๋‚˜ ์ž ์‹œ ์ž ์„ ์ž˜ ๊ฒƒ์ด๋‹ค:

  1. ์šฐ๋ฆฌ๋Š” ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด์ „์— ๊ธฐ๋ณธ ๋””์ž์ธ๊ณผ ํ”„๋กœํ† ์ฝœ ๋””์ž์ธ์„ ๊ฒฐํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ๋œ ์•”ํ˜ธ๋ฌธ ๊ณต๊ฒฉ์€ ์›์‹œ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœํ† ์ฝœ ์„ค๊ณ„์˜ ๋ฌธ์ œ๋ผ๊ณ  ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  2. ์ŠคํŠธ๋ฆฌ๋ฐ 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:

  • ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ธธ์ด: 0, 8, 1016, 1024
  • AAD ๊ธธ์ด: 0, 8, 1016, 1024

AES-CCM:

  • ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ธธ์ด: 0-32
  • AAD ๊ธธ์ด: 0-65536

์ŠคํŠธ๋ฆฌ๋ฐ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 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 ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์˜ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ŠคํŠธ๋ฆฌ๋ฐ ์•”ํ˜ธ ํ•ด๋…์€ AE์— ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ €๋Š” "๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ๊ณ  ์œ„ํ—˜์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ์„ธ์š”"๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ๋˜ํ•œ ".NET์€ ๊ฐ€์น˜ ์ œ์•ˆ์˜ ์ผ๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ (์‰ฝ๊ฒŒ) ํ—ˆ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค"์˜ ํŒฌ์ž…๋‹ˆ๋‹ค.
  • ๋‚ด๊ฐ€ ์›๋ž˜ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฒƒ์ฒ˜๋Ÿผ GCM ์•”ํ˜ธ ํ•ด๋…์„ ์ž˜๋ชป ์ˆ˜ํ–‰ํ•˜๋Š” ์œ„ํ—˜์ด ์ž…๋ ฅ ํ‚ค ๋ณต๊ตฌ์˜€๋‹ค๋ฉด ์—ฌ์ „ํžˆ "์ด๊ฒƒ์€ ๋„ˆ๋ฌด ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. (.NET๊ณผ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์˜ ์ฐจ์ด์ ์€ "์ด ์ผ์„ ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์„ธ์ƒ์ด ๋” ๋งŽ์ด ๋ฐฐ์› ๋‹ค"๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.)
  • ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ›ˆ๋ จ์šฉ ๋ฐ”ํ€ด๊ฐ€ ์ •๋ง๋กœ ๋–จ์–ด์ ธ ๋‚˜๊ฐ€๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ ๊ฐœ๋…์„ ์ฆ๊ฒ๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋ชฉ์ ์— ๋Œ€ํ•œ ๋‚ด ์ƒ๋‹นํžˆ ์›์‹œ์ ์ธ ์ƒ๊ฐ(๊ธฐ์กด ์ œ์•ˆ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์›์ƒท์ด ๋‚จ์•„ ์žˆ์ง€๋งŒ ์ถ”์ƒ ๋Œ€์‹  ๊ฐ€์ƒ ๊ธฐ๋ณธ impl๋กœ ์ถ”์ธก):

```C#
๋ถ€๋ถ„ ํด๋ž˜์Šค AuthenticatedEncryptor
{
// ์ž‘์—…์ด ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ด๋ฉด throw
๊ณต๊ฐœ ์ถ”์ƒ ๋ฌดํšจ ์ดˆ๊ธฐํ™”(ReadOnlySpan๊ด€๋ จ ๋ฐ์ดํ„ฐ);
// ์„ฑ๊ณตํ•˜๋ฉด true, "destination too small"์ด๋ฉด false, ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.
๊ณต๊ฐœ ์ถ”์ƒ bool TryEncrypt(ReadOnlySpan๋ฐ์ดํ„ฐ, ์ŠคํŒฌencryptData, out int bytesRead, out int bytesWritten);
// ๋‚˜๋จธ์ง€ EncryptedData๊ฐ€ ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด false, ๋‹ค๋ฅธ ์ž…๋ ฅ์ด ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด throw๋ฉ๋‹ˆ๋‹ค. NonceOrIVSizeInBits ๋ฐ TagSizeInBits ์†์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
// NonceOrIvUsed๋Š” Initialize๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž…๋ ฅ์œผ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ณต๊ฐœ ์ถ”์ƒ bool TryFinish(ReadOnlySpan๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ, ์ŠคํŒฌ๋‚˜๋จธ์ง€ EncryptedData, out int bytesWritten, Spanํƒœ๊ทธ, ์ŠคํŒฌnonceOrIvUsed);
}

๋ถ€๋ถ„ ํด๋ž˜์Šค AuthenticatedDecryptor
{
// ์ž‘์—…์ด ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ด๋ฉด throw
๊ณต๊ฐœ ์ถ”์ƒ ๋ฌดํšจ ์ดˆ๊ธฐํ™”(ReadOnlySpanํƒœ๊ทธ, ReadOnlySpannonceOrIv, ReadOnlySpan๊ด€๋ จ ๋ฐ์ดํ„ฐ);
// ์„ฑ๊ณตํ•˜๋ฉด true, "destination too small"์ด๋ฉด false, ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.
๊ณต๊ฐœ ์ถ”์ƒ bool TryDecrypt(ReadOnlySpan๋ฐ์ดํ„ฐ, ์ŠคํŒฌDecryptedData, out int bytesRead, out int bytesWritten);
// ์ž˜๋ชป๋œ ํƒœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// (remainingDecryptedData๋Š” CBC+HMAC์— ํ•„์š”ํ•˜๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
๊ณต๊ฐœ ์ถ”์ƒ bool TryFinish(ReadOnlySpan๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ, ์ŠคํŒฌ๋‚˜๋จธ์ง€DecryptedData, out int bytesWritten);
}
```

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) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๊ธ‰์ž๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ํƒœ๊ทธ ๊ด€๋ฆฌ(์˜ˆ: Java)๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š”

์˜ต์…˜ 2) ์‚ฌ์šฉ์ž๊ฐ€ ์Šค์Šค๋กœ ํ•  ์ˆ˜ ์žˆ๋„๋ก API์— ์ถฉ๋ถ„ํžˆ ๋…ธ์ถœ(์˜ˆ: WinNT bcrypt ๋˜๋Š” openssl)

์˜ต์…˜ 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 ๊ฒ€์ฆ์„ ๋ฐ›๋Š” ๋ชจ๋“ˆ ๊ฒฝ๊ณ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํ„ฐ ...

  1. RBG๋Š” ์ด๋ฏธ FIPS ์ธ์ฆ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  2. IV ๋ Œ์ฆˆ >= 96 ๊ถŒ์žฅ
  3. ์žฌ๋ถ€ํŒ…์„ ์ง€์†ํ•˜๋Š” IV ์ƒ์„ฑ ์žฅ์น˜๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด ์•”ํ˜ธํ™” ๊ธฐ๋ณธ ๊ณ„์ธต์œผ๋กœ์˜ ๋ฌด๊ธฐํ•œ ์ „์› ์†์‹ค์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
  4. ์œ„์˜ 3๊ฐ€์ง€๋ฅผ ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์ธ์ฆ์„ ๋ฐ›๋Š” ๊ฒƒ์€ ์–ด๋ ต๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค(๋น„ํŠธ๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋นŒ๋“œ ์ด๋ฏธ์ง€๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ $50K).
  5. ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋Š” 3์„ ๊ตฌํ˜„ํ•˜๊ณ  ์œ„์˜ 4๋กœ ์ธํ•ด ์ธ์ฆ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ผ๋ถ€ ์ด๊ตญ์ ์ธ ๊ตฐ๋Œ€/์ •๋ถ€ ์‹œ์„ค์€ ์ œ์ณ๋‘๊ณ  ๊ฐ€์ž).

... 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);
}

์ดํ›„ ๋ช‡ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋งŒ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ํƒœ๊ทธ๋Š” ์‚ฌ์ „์— ํ•„์š”ํ•˜๋ฏ€๋กœ ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด API๊ฐ€ ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ”„๋กœํ† ์ฝœ(์ฆ‰, ์ƒ์œ„ ์ˆ˜์ค€) ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • INonceProvider ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ NIST ๋ฐ FIPS ์ง€์นจ์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐจ์ด๊ฐ€ ๋„ˆ๋ฌด ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ธ์ฆ๋œ ์•”ํ˜ธํ™” ๊ธฐ๋ณธ ์š”์†Œ์˜ ์˜๋„๋œ ์ถ”์ƒํ™”๋Š” ๊ฟˆ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋” ์ด์ƒ ๋…ผ์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ํƒœ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์€ ์‹ฌ๊ฐํ•ด ๋ณด์ด๊ณ  ํ•ด๋‹น ๋ฌธ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋“œ๋ฌผ๊ณ  ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ํ”„๋กœํ† ์ฝœ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ข‹์€ ๋””์ž์ธ์€ ๋งŽ์€ ๊ฒƒ์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ”„๋กœํ† ์ฝœ์— ๋งก๊ธฐ๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค. (๊ฐ•๋ ฅํ•œ ๋ฐ˜๋ก€๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.)
  2. ๋…ผ์˜๋Š” IV ์ƒ์„ฑ์„ ์ œ์™ธํ•˜๊ณ  ์˜ค์šฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜์ง€ ์•Š๋Š” ์œ ์—ฐํ•˜๊ณ  ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ตฌํ˜„์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ์‹œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜๋Š” ๊ณ ์ˆ˜์ค€ API๊ฐ€ ์ค‘์š”ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„์ด๋ฉฐ ๋Œ€๋‹ค์ˆ˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ €์ˆ˜์ค€ API์—์„œ ์˜ค์šฉ์„ ๋ฐฉ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€์ ์ธ ๋‘๋ ค์›€์ด IV ์„ธ๋Œ€ ์˜์—ญ์—์„œ ์˜ค์šฉ ๋ฐฉ์ง€๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์œ ์ง€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €์ˆ˜์ค€ API์˜ ๋งฅ๋ฝ์—์„œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด byte[] -๋™๋“ฑํ•œ ์ชฝ์œผ๋กœ ๊ธฐ์šธ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฃผ์ž…๋œ INonceProvider ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌํ˜„ ์Šค์™€ํ•‘์ด ๋” ์›ํ™œํ•ด์ง‘๋‹ˆ๋‹ค. @sidshetye ์˜ ์˜๊ฒฌ์€ ๋ฐ˜๋ฐ•ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ RNG๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ„๋‹จํ•œ INonceProvider ๊ตฌํ˜„์ด ์—ฌ์ „ํžˆ ๊ทœ์ •์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  3. ์ถ”์ƒํ™”๋Š” ์œ ์šฉํ•ด ๋ณด์ด๊ณ  ์„ค๊ณ„์— ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์ฏค์ด๋ฉด ๊ทธ๊ฒƒ๋“ค์ด ํ•ด๋ฅผ ๋ผ์น˜๊ธฐ๋ณด๋‹ค ์ด๋กœ์›€์„ ๋” ๋งŽ์ด ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋†’์€ ์ˆ˜์ค€์˜ API๋Š” ์—ฌ์ „ํžˆ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ๋‚ฎ์€ ์ˆ˜์ค€์˜ API๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. IV๋Š” ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด์ด๊ณ  nonce๋Š” IV์˜ ํŠน์ • ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ 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.*๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. - ๋Œ€์นญ ์•”ํ˜ธ๋Š” ์˜ˆ์™ธ์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฐ ์ตœ์ƒ์œ„ ๊ณ„์ธต ์ธ์ฆ ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

1. ์ŠคํŒฌ I/O์šฉ 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 { ... }

2. Span I/O๋ฅผ ์œ„ํ•œ ๊ธฐ์กด 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 {...}
  ...
}

3. Span I/O๋ฅผ ์œ„ํ•ด ๊ธฐ์กด 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)๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ˆ„๋ฝ๋œ ๋น„ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AEAD์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด 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 {...}
  ...
}

AES GCM ํด๋ž˜์Šค

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์„ ํ†ตํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณตํ˜ธํ™”๋Š”

  • NIST 800-38d์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„น์…˜ 5.2.2 "์ธ์ฆ๋œ ๋ณตํ˜ธํ™” ๊ธฐ๋Šฅ"์€ ๋ณตํ˜ธํ™”๋œ ํ‰๋ฌธ P์˜ ๋ฐ˜ํ™˜์ด ํƒœ๊ทธ T๋ฅผ ํ†ตํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ธ์ฆ์„ ์˜๋ฏธํ•ด์•ผ ํ•จ์„ ๋ถ„๋ช…ํžˆ ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ. "Release of Unverified Plaintext"(RUP) ์„ค์ •์—๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ณด์•ˆ ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค. RUP ๋ณด์•ˆ์€ Andreeva-et-al์˜ 2014๋…„ ๋…ผ๋ฌธ์—์„œ ๊ณต์‹ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GCM์€ RUP ์„ค์ •์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•ญ๋ชฉ์„ GCM๊ณผ ๋น„๊ตํ•˜๋Š” CAESAR ๊ฒฝ์Ÿ์—์„œ๋Š” RUP ๋ณด์•ˆ์„ ๋ฐ”๋žŒ์งํ•œ ์†์„ฑ์œผ๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. 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์— ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ํ•ฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. API๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ €์ˆ˜์ค€ API์—๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ธ์  ๊ฐ€ ์ด๊ฒƒ์„ ํ›„ํšŒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. AES-GCM ๊ตฌํ˜„ ์€ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ  API๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ด ์‚ฌ์šฉ๋ฒ•์ด ์ž˜๋ชป๋œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ throwํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ŠคํŠธ๋ฆฌ๋ฐ ๊ตฌํ˜„์ด ์ „์ฒด ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ํ›„์ž๋Š” ๋ถˆํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ ์ค‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ๊ตฌํ˜„์—์„œ ํ™•์ธํ•˜๋Š” SupportsStreaming(out string whyNot) ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ/์ตœ์ข… ํƒœ๊ทธ์— ๋Œ€ํ•œ ํ™•๊ณ ํ•œ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด API๋กœ ์ด๋ฅผ ๋ฐฐ์ œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์‚ผ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@sdrapkin : ์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— RUP๋ฅผ ๋” ๋„“๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์˜ ์‹ค์ œ ๋ฆด๋ฆฌ์Šค/์‚ฌ์šฉ๋ณด๋‹ค ๋ฒ„ํผ๋ง ๋ฐ ๋ ˆ์ด์–ด ์„ค๊ณ„ ๋ฌธ์ œ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. AES GCM์— ๋Œ€ํ•œ NIST ํŠน๋ณ„ ๊ฐ„ํ–‰๋ฌผ 800-38D๋ฅผ ๋ณด๋ฉด

  1. GCM ์‚ฌ์–‘์€ ์ตœ๋Œ€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๊ธธ์ด๋ฅผ 2^39-256๋น„ํŠธ ~ 64GB๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€๊นŒ์šด ๊ณณ์—์„œ ๋ฒ„ํผ๋งํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

  2. 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 , ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ๊ณผ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ์กด SymmetricAlgorithm ์—์„œ ์ƒ์†๋ฐ›๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๊นŒ? ํ†ตํ•ฉํ•˜๋ ค๋Š” ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์ ์„ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ธฐ๋ณธ ํด๋ž˜์Šค๊ฐ€ ์—†๋Š” AuthenticatedEncryptionAlgorithm ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋‹ค๋ฉด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ CreateEncryptor / CreateDecryptor (์ธ์ฆ๋˜์ง€ ์•Š์€!) ๋ฉ”์†Œ๋“œ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ด€๋ จ๋œ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋น„๋Œ€์นญ ์•”ํ˜ธํ™”์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ? ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ด๋ฆ„์—์„œ "๋Œ€์นญ"์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. SymmetricAlgorithm ๋ฅผ ๊ณ„์† ์ƒ์†ํ•˜์ง€ ์•Š๋Š” ํ•œ AuthenticatedSymmetricAlgorithm ๋Š” ๊ธฐ์กด ์šฉ์–ด์ธ ์ธ์ฆ๋œ ์•”ํ˜ธํ™”๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ AuthenticatedEncryptionAlgorithm ๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. TryEncrypt / TryDecrypt ๋ฅผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์„ค์ • ๊ฐ€๋Šฅํ•œ Tag ์†์„ฑ์ด ์žˆ๋Š” ๋Œ€์‹  ํƒœ๊ทธ์— ์“ฐ๊ฑฐ๋‚˜ ๋ฐ›๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  4. public setter๋ฅผ ํ†ตํ•ด key , iv ๋ฐ authenticatedAdditionalData ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ชฉ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์—ฌ๋Ÿฌ ์œ ํšจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค ์—†์ด ์—…๋ฐ์ดํŠธ๋œ ์ œ์•ˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  5. AesGcm ์˜ ์ƒํƒœ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด ๋ณธ๋Šฅ์€ iv ๋ฐ authenticatedAdditionalData ๊ฐ€ ๋ฉ”์‹œ์ง€๋‹น์ด๋ฏ€๋กœ ํ™•์‹คํžˆ ๋ฐฐ์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. key ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผ ํ‚ค๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜ธ์ถœ๋ณ„๋กœ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. CreateAuthenticatorEncryptor ์—๋„ ๋™์ผํ•œ ์งˆ๋ฌธ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด _๋‹จ๋ฐฉํ–ฅ_์œผ๋กœ ์ •์ฐฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ €๋Š” AesGcm ์˜ ํ‚ค ์ƒํƒœ์— ๊ธฐ๋Œ€๊ณ  ์žˆ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฐ๊ฐ CreateAuthenticatedEncryptor ๋˜๋Š” TryEncrypt ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋™์˜ํ–ˆ๋‹ค๋ฉด ์—…๋ฐ์ดํŠธ๋œ ์ œ์•ˆ์„ ๋ณด์—ฌ์ฃผ์„ธ์š”. :-)
  6. ICipherTransform ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค CipherTransform ์—ฌ์•ผ ๊ธฐ์กด ๊ตฌํ˜„์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. ๋ชจ๋“  ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” camelCase๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ authenticatedData ๋˜๋Š” authenticatedAdditionalData ๋ผ๊ณ  ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ plaintext ๋ฐ ciphertext ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  8. IV๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ณณ๋งˆ๋‹ค ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ ์ ˆํ•˜๊ฒŒ ์ƒ์„ฑ๋œ(์•”ํ˜ธํ™”๋œ) IV๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ €์ˆ˜์ค€ API์˜ ์˜ค์šฉ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋ฌด๋ฃŒ๋กœ ์–ป์Šต๋‹ˆ๋‹ค.
  9. ๋‚˜๋Š” ์—ฌ์ „ํžˆ 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ยข:

  • ์ŠคํŠธ๋ฆผ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ง์ ‘ ์ง€์›ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์„ ๋…ธ์ถœํ•˜๋Š” ์ €์ˆ˜์ค€ API ์œ„์— ๊ตฌ์ถ•๋œ ๊ณ ์ˆ˜์ค€ ๋ž˜ํผ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค(๋น„ํšจ์œจ์ ์ด์ง€๋งŒ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ).
  • AES-GCM์ด ์–ด๋–ค ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ์ŠคํŠธ๋ฆผ์„ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ŠคํŠธ๋ฆผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” AES-CBC-HMAC์˜ ํ•ฉ๋ฒ•์ ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ๋‹ค๋ฅธ AE ์•Œ๊ณ ๋ฆฌ์ฆ˜.
  • ๋ ˆ๋ฒจ์ด ๋†’์„์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜ํ•  ์˜์—ญ์ด ์ ์„์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ์˜๋ฏธ โ€” ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ฒƒ์„ ์ˆจ๊ธฐ๋Š” API๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ด ์ธ์ฆ ํƒœ๊ทธ). ๋ฌผ๋ก  ๋” ๊ตฌ์ฒด์ ์ธ ์˜ค๋ฒ„๋กœ๋“œ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).
  • IMHO๋Š” ๋‹จ์ˆœํžˆ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์•”ํ˜ธํ™” ์„œ๋น„์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด openssl์ด CLI๋กœ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด๋ฉฐ ๊ฒฐ๊ณผ๊ฐ€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ธ์ฆ ํƒœ๊ทธ๋ฅผ ์ œ๊ณตํ•  ๊ฐ€๋Šฅ์„ฑ ์—†์Œ).

์šฐ๋ฆฌ(.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 ์„ธ๊ณ„์— ๊ทธ๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


  • ๊ณ ๊ฐ: ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ์ธ์ฆ๋œ ์•”ํ˜ธํ™”?
  • microsoft: ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ณ ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ์‚ฌ๋˜์ง€ ์•Š๊ณ  ์•ˆ์ „์„ฑ์ด ์˜์‹ฌ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋ถ€์ฑ„๋„ ๊ณต๊ฒฉ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๊ณ ๊ฐ:

@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์ด ๋‚˜์™”์–ด์š”. ๋‹ค์Œ์ฃผ ๋งˆ์Šคํ„ฐ ์ˆ˜์š”์ผ์— ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰