2009-08-23 2 views

답변

2

Seek 조작은 ECB 스타일 체인 (즉, 블록을 개별적으로 암호화)으로 일정 시간 (알고리즘에 따라 상대적으로) 수행 할 수 있기 때문에 그러한 구현은별로 유용하지 않을 것이라고 생각합니다. 그 문자열은 highly unrecommended - see the image in this Wikipedia article for a startling example of insecurity입니다.

MemoryStream 또는 이와 유사한 줄 바꿈 기술로 /로부터 복사하는 것이 나을 것 같습니다.

+0

문제가 있습니다. 그러나 TrueCrypt에서 사용되는 http://en.wikipedia.org/wiki/Disk_encryption_theory#XTS와 같이 안전한 블록 단위 암호화를 허용하는 여러 가지 방법이 있습니다. –

+1

디스크 암호화는 각 블록을 독립적으로 암호화합니다. 이는 임의적으로 검색하는 방식입니다. –

4

블록 단위 암호화는 완벽하게 안전합니다. 문제가되는 것은 ECB 일뿐입니다. 구현은 아마도 OFB 또는 CTR 모드를 사용하여 작성 될 수 있습니다. 그러나, 나는 그것을 결코 찾을 수 없었다. ... 총알을 물고을 쓸 수 있습니다

는 UPDATE :

그래서 나는이의 구현을 작성했다. 여러 가지 이유로 저는 지금 여기에 게시하지 않을 것입니다. (어떤 점을 시도해 보겠습니다.)하지만 여기서는이 작업을 원하는 사람들을위한 몇 가지 지침이 있습니다.

RijndaelManaged 변환을 CBC 모드로 사용하십시오. 당신은 블록 단위로 암호 스트림을 계산할 것입니다. 변환에서 키와 공백 (모두 0) iv를 초기화하여이를 수행 할 수 있습니다. 실제 iv는 블록 단위로 계산됩니다.

nonce + iv plus 카운터를 연결하거나 계산하여 현재 블록에 대한 입력을 계산하는 방법이 필요합니다. 여기에 noncomput & iv를 미리 계산하는 등의 여러 최적화 작업을 수행 할 수 있습니다 (이 방법은 여러 번 호출되므로 가치가있을 것입니다).

(참고 : 여기에서 "iv"는 NIST가 전체 블록의 중간 부분이라고 부르는 것을 의미하며 다른 사람이 호출하는 부분입니다.) IV를 집합 적으로 사용)

데이터를 암호화하는 루프에서이 메서드를 사용합니다. 첫 번째 호출 후 블록 경계에서 호출하여 현재 암호 스트림을 업데이트합니다. 이 메서드는 변환의 TransformBlock 메서드에 입력을 제공합니다. 변환 결과를 현재 데이터 블록과 XOR하여 결과를 얻습니다. 각 블록이 암호화 된 후에 transform.Reset()을 사용하십시오! 그렇지 않으면 CBC는 변환 결과를 다음 입력으로 사용하려고합니다. .NET으로 이것을하는 더 영리한 방법이 있을지 모르지만, 나는 그것을 이해할 수 없다. BouncyCastle이 OFB를 "기본적으로"지원하여 더 나은 옵션이 될 수 있지만 이것이 외부 deps없이 매우 재사용 가능한 cryptostream을 얻을 수있는 좋은 빠른 방법이라는 것을 알고 있습니다.

어쨌든,이 전체적인 방법 (나는 이것을 AesCtr256.Process라고 부르지 만 더 일반적 일 수 있습니다)은 암호 스트림 내부의 임의의 범위의 데이터에서 작동한다는 것입니다. 이 메서드는 사용자 지정 Stream 클래스에서 쉽게 사용할 수 있습니다. 이렇게하면 읽기 및 쓰기 모두에서 스트림 내부의 임의의 위치를 ​​검색 할 수 있으며 작업 할 바이트 정렬 데이터를 제공합니다 (실제 데이터 길이를 실제로보고하는 암호화 스트림을 가질 수 있으므로 정말 좋습니다).

다른 말로하면 스트림의 임의 부분에 대한 암호 스트림을 계산 한 다음 암호화 또는 일반 텍스트에 대해 xor 또는 암호화/암호 해독을 수행하는 것입니다.

마지막으로 두 가지 : 1.) 스트림의 수명을 위해 변환을 재사용하는 것이 좋습니다. 이렇게하면 비용이 많이 듭니다. 2.) 이것을 구현하려면 NIST 벡터 또는 이와 유사한에 대한 단위 테스트를 작성하십시오. 출력이 무작위로 표시 되었기 때문에 출력이 올바르게 암호화 된 것은 아닙니다. :)

누구나 더 나은 접근 방식에 대한 생각이 있거나 내가 정말로 중요한 코드 조각을 어떻게 망쳐 놓았는지 알려 주시면 감사하겠습니다.

0

중복되는 질문입니다. 나는 대답을 넣었습니다 : How to add seek and position capabilities to CryptoStream

심지어 ECB를 사용하고 있지만 다른 알고리즘을 사용할 수도 있습니다. ECB를 다르게 사용하기 때문에 Barry Kelly가 언급 한 것처럼 ECB 문제가 없습니다.