읽었습니다
일반적인 스트림 cipher는 일반 텍스트를 한 번에 한 바이트 씩 암호화하지만 스트림 암호는 한 번에 1 비트 또는 한 번에 1 바이트보다 큰 단위에서 작동하도록 설계 될 수 있습니다.
(출처 : 암호화 및 네트워크 보안 , William Stallings.)
블록 암호는 한 번에 한 블록 씩 암호화합니다. 블록의 크기는 1 바이트 이상이거나 그 이하일 수 있습니다. 즉, 스트림 암호를 사용하여 1 바이트 블록을 스트림으로 암호화 할 수도 있습니다.
그러면 스트림 암호와 블록 암호의 차이점은 정확히 무엇입니까?
댓글
- IMHO의 많은 개념 / 정의는 명확하지 않지만 유동적 인 의미에서 경계가 있습니다. 보다 정확한 이해를 돕기 위해 일반적으로 적절한 컨텍스트가있는 담화에서 편리하기 때문에 이러한 방식으로 사용됩니다. 따라서 중복이 있습니다. 여기서 문제에 대한 좋은 비유는 " 부자 " 대 " 불쌍한 사람 ".
- 질문의 첫 번째 문단은 암호화 및 네트워크 보안 i i에서 한 마디로 복사 된 것 같습니다. > (William Stallings, 섹션 6.3). 항상 외부 출처에서 복사 한 자료의 출처를 명시해야합니다. crypto.stackexchange.com/help/referencing 을 참조하세요.
- 스트림 암호는 또는 ' 랩 '합니다. 예를 들어 AES SIC를 사용하여 키 스트림을 생성 할 수 있습니다. 키 스트림의 길이가 블록 크기의 N 배라는 사실은 암호 / 일반 텍스트의 길이와 관계가 없습니다.
Answer
블록 암호 $ k $ 비트 키와 $ n $ 비트 (일반 텍스트)의 결정적이고 계산 가능한 함수입니다. 블록을 $ n $ 비트 (암호문) 블록으로 변환합니다. (보다 일반적으로 블록은 비트 크기 일 필요가 없습니다. $ n $ -character-blocks도 여기에 맞습니다.) 즉, 암호화 할 때 동일한 키를 가진 동일한 일반 텍스트 블록에 대해 동일한 결과를 얻을 수 있습니다. (우리는 일반적으로 함수가 반전 가능하기를 원합니다. 즉, 키와 암호문 블록이 주어지면 일반 텍스트를 계산할 수 있습니다.)
실제로 메시지 (모든 크기)를 암호화하거나 복호화하려면 그렇게하지 마십시오. ” t 블록 암호를 직접 사용하지만 작동 모드 . 가장 간단한 모드는 전자 코드북 모드 (ECB) 로 메시지를 블록 단위로 자르고 각 블록에 암호를 적용합니다. 결과 블록을 출력합니다. (일반적으로 보안 모드는 아닙니다.)
Caesar에서 사용하는 것과 같은 일부 초기 암호화 체계는 “ECB에서 1 문자 블록이있는 블록 암호”로 분류 될 수 있습니다. -mode “. 또는 일반적으로 코드북 이있는 모든 것입니다.
일반적으로 초기화 벡터 및 일종의 피드백을 통해 모든 블록이 모든 메시지는 다른 방식으로 암호화됩니다.
스트림 암호 는 $ k $ -비트 키와 임의 길이 일반 텍스트를 (동일한 임의 길이) 암호문에 직접 매핑하는 함수입니다. 평문의 접두사가 암호문의 접두사에 매핑되는 방식, 즉 평문의 후행 부분이 알려지기 전에 암호문의 시작 부분을 계산할 수 있습니다. (종종 메시지 크기는 일부 “블록 크기”의 배수로 제한 될 수 있지만 일반적으로 전체 바이트와 같은 더 작은 블록으로 제한됩니다.)
일반 텍스트의 일부가 반복되는 경우 해당 암호문은 일반적으로 동일하지 않습니다. 메시지의 다른 부분이 다른 방식으로 암호화됩니다.
종종 이러한 스트림 암호는 실제 키에서 키 스트림 을 생성하여 작동합니다 (그리고 초기화 벡터 일 수도 있음). ) 그런 다음 메시지와 함께 XOR 처리합니다.이를 동기 스트림 암호 . 다른 스트림 암호는 이전 부분에 따라 메시지의 미래 부분에 대한 암호화를 다를 수 있습니다.
일부 블록 암호 작동 모드는 실제로 CTR 및 OFB 모드.
다른 메시지에 대해 동기 스트림 암호 (스트리밍 모드의 블록 암호 포함)의 키 (및 해당되는 경우 IV)를 절대로 재사용해서는 안됩니다. 이는 손상을 초래할 수 있기 때문입니다. (동일한 메시지에 대해서도 메시지를 반복했음을 보여줍니다.)
실제 사용에서는 MAC도 필요합니다. 메시지에 대한 무결성 보호. (예를 들어, 선택한 암호문 공격의 경우 일부 체계가 손상되며 이러한 MAC은이를 방지합니다 (MAC를 확인한 후 메시지를 암호 해독기에 전달하는 경우에만).)
Comments
- 스트림과 블록 중 언제 선택 하시겠습니까? 보안에 차이가 있습니까? 아니면 암호화 속도?
- @anoopelias 블록 암호는 일반적으로 스트림 암호에 비해 느립니다. 또한 확실하지 않지만 스트림 암호는 정보 보안을 제공하는 데 능숙하고 블록 암호는 계산 보안을 제공하는 데 능숙하다고 생각합니다
- 마지막 단락과 관련하여 다음과 같은 예에 대한 링크를 제공하십시오. MAC을 추가하면 선택한 암호문 공격으로부터 보호됩니까?
답변
수학적으로 블록 암호는 $ n $ 비트 블록의 $ \ {0,1 \} ^ n $ 집합에 대한 키가 지정된 의사 난수 순열 계열. (실제로는 일반적으로 역순 열을 계산하는 효율적인 방법이 필요합니다.) 자체적으로 블록 암호는 실제 암호화에 그다지 유용하지 않습니다. 적어도 작은 암호화가 필요한 경우가 아니면 각각 하나의 블록에 맞는 메시지입니다.
그러나 블록 암호는 다른 암호화 도구를 구성하기위한 매우 다재다능한 빌딩 블록입니다. 일단 좋은 블록 암호가 있으면 스트림 암호부터 해시 기능, 메시지 인증 코드, 키 유도 기능, 의사 난수 생성기, 엔트로피 풀 등에 이르기까지 단 하나의 블록 암호를 기반으로 쉽게 구축 할 수 있습니다.
이러한 모든 애플리케이션이 반드시 필요한 것은 아닙니다. 블록 암호가 필요합니다. 예를 들어, 이들 중 다수는 순열이 필요하지 않은 의사 난수 함수 를 기반으로 할 수 있습니다 (하지만 편리하게는 ” 기본 ). 또한 대부분의 구성은 간접적입니다. 예를 들어 메시지 인증 코드에서 키 파생 함수를 구성 할 수 있습니다. 해시 함수에서 구성. —는 할 수 있지만 블록에서 구성 할 수는 없습니다 . 암호. 그러나 여전히 블록 암호가있는 경우 나머지 암호를 모두 구축 할 수 있습니다 .
또한 이러한 구성에는 일반적으로 보안을 감소시키는 (조건부) 보안 증명이 함께 제공됩니다. 생성 된 기능을 기본 블록 암호의 기능과 비교합니다. 따라서 이러한 각 기능을 개별적으로 암호화하는 힘들고 신뢰할 수없는 작업을 수행 할 필요가 없습니다. — 대신 모든 노력을 블록 암호에 집중할 수 있습니다. 블록 암호의 보안에 대한 확신은이를 기반으로하는 모든 기능에 대한 확신으로 직접 변환됩니다.
분명히 작업하는 경우이 모든 것이 매우 편리합니다. 많은 개별 암호화 프리미티브에 대해 효율적이고 안전한 코드를 포함하는 것이 어렵고 비용이 많이 드는 작은 임베디드 플랫폼입니다. 하지만 그렇게 제한된 플랫폼을 사용하지 않더라도 사이드 채널 공격과 같은 것에주의를 기울여야하므로 저수준 암호화 코드를 작성하고 분석하는 것은 힘들 수 있습니다. . 제한된 수의 저수준 빌딩 블록으로 자신을 제한하고 필요한 모든 것을 구축하는 것이 더 쉽습니다.
또한 메모리가 많은 빠른 플랫폼에서도 데스크톱 CPU와 마찬가지로 하드웨어에서 직접 저수준 암호화 작업을 구현하는 것이 소프트웨어 —에서 수행하는 것보다 훨씬 빠를 수 있지만 그중 몇 개 이상을 수행하는 것은 실용적이지 않습니다. . 다용도로 인해 블록 암호는 하드웨어 구현에 탁월한 후보입니다 (최신 x86 CPU의 AES 명령 세트 에서와 같이).
그러면 스트림 암호는 어떻습니까?
수학적으로는 스트림 암호 — 가장 일반적인 의미에서 —는 또한 키가있는 반전 가능한 의사 난수 함수 패밀리이지만 제한된 길이의 블록이 아닌 임의 길이 비트 문자열의 $ \ {0,1 \} ^ * $ 세트에 있습니다.
(여기에는 약간의 미묘한 차이가 있습니다. 예를 들어 대부분의 스트림 암호 구성에서는 입력에 고유 한 nonce 값을 포함해야하며 그렇지 않은 경우 동일한 임시 값이 두 개의 다른 입력에 사용되는 경우 진정한 무작위 함수 —와 구별 할 수 없다는 의미에서 — 보안을 보장합니다. 임의의 함수를 선택하기 위해 $ \ {0,1 \} ^ * $에서 자체적으로 가역 함수에 대한 균일 한 분포가 없습니다. 스트림 암호가 “무작위에서 알아볼 수 없음”으로 보이는 의미를 신중하게 정의해야합니다. 예를 들어 대부분의 스트림 암호는 메시지 길이를 유출합니다. 실제로는 일반적으로 스트림 암호도 필요합니다. 임의의 긴 입력 비트 스트림을 — 암호화하고 o를 사용하여 — 암호를 해독 할 수 있다는 점에서 “스트리밍”합니다. 메시지 길이가 일정하지 않고 시간이 선형 적입니다.)
물론 스트림 암호는 블록 암호보다 훨씬 즉시 유용합니다.이를 직접 사용하여 모든 길이의 메시지를 암호화 할 수 있습니다. 그러나 다른 암호화 도구를위한 빌딩 블록으로도 유용하지 적습니다 . 블록 암호가 있으면 쉽게 스트림 암호로 변환 하는 반면 임의의 스트림 암호를 블록 암호로 변환하는 것은 불가능하지는 않지만 어렵습니다 .
그렇다면 사람들이 전용 스트림 암호를 설계하는 데 전혀 신경을 쓰지 않는 이유는 블록 암호가 그 일을 잘 수행 할 수 있다면 무엇일까요? 대부분의 이유는 속도 때문입니다. 때로는 많은 데이터를 암호화하기 위해 빠른 암호가 필요합니다. em> 정말 빠른 전용 스트림 암호 설계입니다. 이러한 설계 중 일부는 소프트웨어 나 하드웨어 또는 둘 다에서 구현하기에 매우 간결하게 설계되었으므로 실제로 스트림 암호 만 필요한 경우 다음을 수행 할 수 있습니다. 일반적인 블록 암호 기반 암호 대신 이러한 암호 중 하나를 사용하여 코드 / 회로 크기를 절약 할 수 있습니다.
그러나 속도와 간결성 측면에서 얻을 수있는 이점은 다양합니다. xample, 스트림 암호로 해시 함수를 만드는 간단한 방법이없는 것 같습니다. 따라서 이러한 암호 중 하나가 필요하면 해시 함수는 그 자체로 유용 할뿐 아니라 다른 암호화 도구에 대한 공통 빌딩 블록이기도하므로 별도로 구현해야합니다. 그리고 대부분의 해시 함수는 블록 암호를 기반으로하므로 암호화를 위해 동일한 블록 암호를 재사용하는 것이 좋습니다 (전용 스트림 암호의 원시 속도가 실제로 필요하지 않은 경우).
댓글
- 두 개의 다른 용어가 필요한지 질문했습니다. 설명하신 내용에 따르면 스트림 암호는 단순히 블록 암호의 특수한 경우입니다. 즉, {0,1} ^ n 집합의 n이 1 인 제한 사례의 경우입니다. 따라서 현재를 유지하지 않는다고 주장합니다. 용어의 구별.
- @ Mok-KongShen 실제로 스트림 암호는 단순히 블록 크기가 1 인 블록 암호가 아닙니다 (두 가지 모두라고 가정 할 수있는 고전적인 단일 알파벳 암호는 제외). 스트림 암호는 일반적으로 암호의 현재 내부 상태에 따라 스트림의 비트 / 바이트 / …를 다르게 변환하는 반면 동일한 입력에 대한 블록 암호는 동일한 출력을 갖습니다 (따라서 일반적으로 " 작동 모드 " (스트림 암호 생성)).
- @PauloEbermann. IMHO는 " 역학 및 가변성 "과 관련된 CodesinChaos의 질문에 답했습니다.
- @ Mok-KongShen 아니요 그는 '하지 않았습니다. 전용 스트림 암호가 적절한 모드에서 블록 암호에 비해 갖는 유일한 이점은 성능입니다. 제정신이 적절한 연결없이 블록 암호를 사용하지 않기 때문에 연결 모드를 무시할 수 없습니다 '.
- @CodesInChaos. 응용 프로그램마다 성능 요구 사항이 다릅니다. 예를 들어 암호화하려면 이메일, ' 예를 들어 비디오 파일의 암호화에 바람직한 성능이 필요하지 않습니다.
Answer
블록 암호 자체가 n
비트를 n
에 매핑합니다. 키를 사용하는 비트. 즉, “키가있는 의사 무작위 순열입니다. 더 길거나 짧은 텍스트를 허용 할 수 없습니다.
메시지를 실제로 암호화하려면 항상 연결 모드가 필요합니다. ECB는 이러한 연결 모드 중 하나입니다. (그리고 정말 나쁜 것입니다) 그리고 이것은 순수한 블록 암호가 아닙니다. ECB조차도 “추가 처리 작업”으로 구성됩니다. 이러한 연결 모드는 매우 다른 속성을 가질 수 있습니다.
가장 널리 사용되는 연결 모드 중 하나 인 카운터 모드 (CTR)는 블록 암호에서 동기 스트림 암호를 생성합니다.또 다른 모드 인 CFB는 CBC와 동기 스트림 암호 사이의 속성을 사용하여 자체 동기화 스트림 암호를 구성합니다.
따라서 스트림과 블록 암호 사이에 암호가 없다는 가정은 사실이 아닙니다. 완전히 새로운 시스템을 만드는 대신 잘 알려진 블록 암호 기본 형식에서 빌드하는 것을 선호합니다.
비제 네르를 스트림 암호라고 부릅니다. 2 기호 인코딩 대신 26 기호 인코딩을 사용하지만 스트림 암호가 아니라는 의미는 아닙니다. 26 개의 기호가있는 스트림 암호의 현대적인 구성은 Solitaire / Pontifex 를 참조하세요.
댓글
- 오류가없는 경우 ', " 연결 " 블록 암호화는 일반적으로 " 블록 체이닝 "의 컨텍스트에서 사용됩니다. 즉, 연속 블록을 서로 의존하여 렌더링하여 분석이 더 어렵습니다. 따라서 IMHO ECB는 정의상 연결 효과가 없을 것입니다.
- 당신은 잘못했습니다. 좋은 연결 모드에는 이러한 속성이 있지만 잘못된 모드는 여전히 존재합니다!
답변
암호화에는 두 가지 기본 유형이 있습니다.
- 대칭. 암호화 및 복호화에 동일한 키를 사용합니다.
- 비대칭. 암호화 및 해독을 위해 두 개의 다른 키 (공개 및 개인)를 사용합니다.
블록 암호 및 스트림 암호는 대칭 암호화의 일부를 구성합니다. Stream Cipher는 사용자가 지정한 키에서 확장 된 키 스트림을 생성 한 다음 일반 텍스트 (암호화 용) / 암호화 텍스트 (복호화 용)로 XoR합니다.
Block Cipher는 데이터 블록을 입력으로 사용하는 반면 여러 라운드를 실행합니다. 키 혼합과 함께 암호 텍스트를 생성합니다. 블록 암호는 카운터 (CTR) 모드가 스트림 암호와 유사하게 작동하는 다양한 작동 모드를 가지고 있습니다. 블록 암호에 순차 번호가 입력되고 그 출력은 일반 텍스트로 Xored되어 암호문을 만듭니다. 이 작동 모드에서는 블록 암호의 암호화 코드 만 필요합니다. 복호화 코드가 필요하지 않습니다. 복호화를 위해 동일한 순차 번호를 입력하여 암호를 차단하고 출력을 Ciphertext로 Xored하여 일반 텍스트를 얻습니다. 때때로 nounce가 Counter와 함께 사용되기 때문에 입력 블록 암호는 두 개로 나뉩니다. 즉 고정 nounce와 Incremental Counter입니다.
기타 작업 모드 –
- ECB (기밀성을 제공)
- CBC 및 CTR (선택된 일반 텍스트 공격에 대해 기밀성을 제공하고 시멘틱하게 보호)
- EAX, CCM 및 GCM (인증 된 암호화 제공)
자세한 내용은 여기
에서 찾을 수 있습니다.