검수요청.png검수요청.png

스케인

위키원
(Skein에서 넘어옴)
이동: 둘러보기, 검색
스케인(Skein)

스케인(Skein)은 브루스 슈나이어(Bruce Schneier)가 주도하는 그룹이 개발한 가변 비트 해싱 알고리즘이다. 스케인은 암호화 해시 기능으로 NIST 해시 함수 경쟁에서 다섯 중 하나로 SHA-1SHA-2SHA-3 은 결국 NIST 해시인 Keccak 에 밀렸으며, 암호화 해시 함수의 새로운 제품으로 속도, 보안, 단순성 및 분석하기 쉬운 모듈 패키지의 유연성이 뛰어나다.[1]

개요[편집]

스케인은 블록 암호, 쓰리피시(Threefish)를 기반으로 UBI-해싱 모드 에서 작동하며 암호화, 보안 분석, 소프트웨어, 칩 설계 및 실제 암호화 시스템 구현 분야의 전문성을 갖춘 학계 및 업계의 고도 숙련 된 암호화 전문가팀이 설계하였고, 개발 목적은 이러하다.

  • 최소한의 메모리 사용을 위한 최적화
  • 암호 적으로 안전한 작은 메시지의 해싱
  • 해시 기능에 대한 기존의 모든 공격에 대한 저항성
  • 64비트 프로세서 최적화
  • 테이블 접근의 적극적인 사용

역사[편집]

스케인은 브루스 슈나이어(Bruce Schneier), 닐스 퍼거슨(Niels Ferguson), 스테판 럭스(Stefan Lucks), 더그 호분(Doug Whiting), 미 히르 벨레 어(Mihir Bellare), 타다요시 코노(Tadayoshi Kohno), 존 칼라스(Jon Callas), 제시 워커(Jess Walker)에 의해 만들어졌다.[2] 스케인에 기초 Threefish tweakable는 블록 암호 사용하여 압축 고유 블록 반복 (UBI) 체인 모드의 변형 마 탸스 - 메이어 Oseas의 해시 모드 유연성을 선택적 저 부하 인자 시스템을 활용하면서. 스케인의 알고리즘과 참조 구현은 공개 도메인에 제공되었다.

특징[편집]

스케인은 256, 512비트 및 1024비트의 내부 상태 크기와 임의 출력 크기를 지원하며, Intel Core 2 Duo에서 64비트 모드의 출력 크기에 대해 바이트 당 6.1 사이클을 요구한다. 쓰리피 시의 핵심은 MIX 함수를 기반으로 하는데, MIX 함수는 상수와 XOR을 한 번 더 추가하여 두 개의 64비트 단어를 변환하고, UBI 체이닝 모드는 입력 체인값과 임의 길이 입력 문자열을 결합하고 고정 크기 출력을 생성한다. 쓰리 피쉬의 비선형성은 덧셈 연산과 배타적 논리합의 결합으로부터 오고, S 박스를 사용하지 않으며, 기능은 64비트 프로세서에 최적화되어 있어 스케인 용지는 무작위 해시, 병렬 트리 해싱, 스트림 암호, 개인 설정 및 키 유도 기능과 같은 선택적 기능을 정의한다.

  • 스케인의 장점
  1. 빠른 속도 : 주요 제안인 스케인-512는 64비트 CPU에서 바이트 당 6.1 클럭 사이클의 데이터를 해시하고, 3.1GHz x64 코어 2 듀오 CPU에서 스케인은 코어당 500MByte의 속도로 데이터를 해시 하는데 이는 SHA-512보다 거의 두 배 빠르며 SHA-256보다 3배 빠르다. 해시 트리 모드는 병렬 처리가 가능한 구현을 더욱더 빠르게 하며, 짧은 메시지에도 빠르고, 스케인-512는 짧은 메시지를 약 1000 클럭 주기로 해싱한다.
  2. 안전한 보안 : 보수적인 디자인은 쓰리 피시 블록 암호를 기반으로 하고, 쓰리 피시-512에 대한 현재 최고의 공격은 2.9의 안전 계수에 대해 72라운드 중 25회에 있다. 비교를 위해 표준화 과정의 비슷한 단계에서 AES 암호화 알고리즘은 안전 계수가 1.7에 불과하여 10회 중 6회를 공격했으며, 스케인은 입증할 수 있는 많은 보안 속성을 가지고 있어 알고리즘에 대한 신뢰가 크게 높아졌다.
  3. 간단한 알고리즘 : 세 가지 기본 연산 만 사용하면 스케인 압축 함수를 쉽게 이해하고 기억할 수 있으며, 나머지 알고리즘 은이 함수의 간단한 반복 이어서 간단하게 이루어져 있다.
  4. 유연한 함수 : 스케인은 세 가지 다른 내부 상태 크기(256비트, 512비트, 1024비트)와 모든 출력 크기에 대해 정의되는데 스케인이 SHA 전체 해시 함수 제품군의 드롭인 대체품이 될 수 있고, 완전히 선택적이며 확장 가능한 인수 시스템은 스케인을 매우 많은 수의 함수 PRNG, 스트림 암호, 키 유도 함수, HMAC 오버 헤드 없는 인증 및 개인화 기능에 사용할 수 있는 효율적인 도구로 만들어 준다. 모든 기능은 매우 낮은 오버헤드로 구현될 수 있고, 스케인의 핵심인 Three fish Large-block cipher와 함께 대부분의 최신 응용 프로그램에 적합한 대칭 암호화이다.
  5. 효율적인 하드웨어와 소프트웨어의 플랫폼 : skein-512는 약 200바이트의 상태로 구현되고, 8비트 스마트카드와 같은 소형 장치는 약 100바이트의 메모리를 사용하여 skein-256을 구현한다.
  • 암호해독
2010년 10월에는 회전식 암호 해독과 리바운드 공격을 결합한 공격이 게시되었습니다. 이 공격은 Three fish-256 에서 72라운드 중 53개, 쓰리 피시-512에서 72라운드 중 57개에 대해 회전 충돌을 찾았는데, 스케인 해시 함수에도 영향 주어 2월에 발간된 이전 공격에 대한 후속 조치로 39회와 42회를 각각 중단하였고, 스케인 팀은 NIST 해시 함수 경쟁 3라운드 에서 주요 일정을 조정하여 이러한 공격이 덜 효과적이라고 판단했다.
  • 쓰리 피시(Three fish)
쓰리피시 는 스케인 해시 함수의 일부로 2008년에 만들어졌으며 NIST의 SHA-3 경쟁에 제출되었다. 256, 512 및 1024비트 블록 및 임의 출력 크기에 대해 정의된 구성 가능한 블록 암호다. 암호는 퍼머테이션 네트워크로 구현된다. 쓰리피쉬의 핵심은 상수와 XOR에 의한 회전, 한 번의 덧셈을 이용하여 64비트 단어 2개를 변환하는 MIX 함수 에 기반을 두고 있다는 것이다. UBI 체인 모드는 임의의 길이 입력 문자열과 입력 체인값을 결합하여 고정 크기 출력을 생성한다. 256비트·512비트 암호에는 72라운드를, 1024비트 암호에는 80라운드를 사용한다. 라운드 사이에는 단어들이 산재해 있으며, 4회전마다 키에 추가되어 비선형성이 있다. 비선형성은 전적으로 추가 연산과 XOR의 결합에서 비롯된다. 그것은 S-boxes를 사용하지 않는다. 기능은 64비트 프로세서에 최적화되어 있으며, 스케인 논문에서는 랜덤화 해싱, 병렬화 가능한 트리 해싱, 스트림 암호, 개인화, 키 파생 기능 등의 선택적 특징을 정의하고 있다. 쓰리피 시는 64비트 단어로 작동하는 고정 된 양의 XOR 세 가지 작업으로 구성되는데 Threefish-256 및 Three fish-512는 72라운드로 구성되고, Threefish-1024는 80발로 구성된다. 쓰리피시는 단순한 조작만을 사용하기 때문에 성능을 염두에 두고 설계되었기에 Threefish-512는 64비트 시스템에서 바이트 당 6.1 클럭 주기로 데이터를 암호화하고, Three fish-1024는 바이트 당 6.5 클럭 사이클에서 데이터를 암호화한다.[1]
  • 유비아이(UBI)
쓰리피쉬 유비 아이(UBI; Unique Block Iteration) 해싱 모드에서 사용된다. UBI 모드는 Matyas-Meyer-Oseas 모드의 일종이다. 각 UBI 링크는 체인의 이전 링크에서 나온 입력 메시지를 임의 길이의 시퀀스와 결합하고 출력값을 고정 크기로 설정한다. 링크 사이에 전송된 메시지에는 처리된 바이트 수, 체인의 시작 및 종료 플래그, UBI 응용 프로그램을 구별할 수 있는 데이터 유형 필드가 포함되어 있다. UBI는 동일한 메시지를 해싱한 결과를 재현할 수 없으며 동일한 메시지가 해시함수와 암호로 들어갈 수 있도록 함으로써 추가적인 보호를 제공한다는 것을 보장한다.
  • 파이스케인(PySkein)
파이스케인NIST SHA-3 경연대회 의 5개 최종 후보 중 하나인 스케인(Skein) 해시알고리즘를 구현한 파이썬 의 확장 모듈이다. 다양한 매개변수를 가진 유연한 해시 모드를 제공함으로써 대체 해시 알고리즘으로 유용하다. PySkein은 Pythonic 인터페이스 를 통해 스케인의 모든 특징을 제공하며 GNU (General Public License)에 따라 무료 소프트웨어로 출시된다. 특징은 다음과 같다.
  1. 파이썬(Python) 표준 라이브러리의 해시 알고리즘을 따르는 간단한 인터페이스
  2. Athlon 64 X2 에서 측정된 두 코어에서 최적화된 C 구현(시퀀트 해싱의 경우 7.1 사이클/바이트 및 트리 해싱의 경우 4.2 사이클/바이트)을 통한 고성능
  3. 스케인에서 사용되는 수정 가능한 블록 암호인 Three fish -> 스스로 암호화와 암호 해독에 이용
  • 해시 객체
  1. 업데이트 ( 메시지, 비트 = 없음 ) : 지정된 형태의 메시지를 내부 상태에 해시 한다. 문자열은 먼저 바이트로 인코딩되어야 하고, 반복 호출은 모든 인수를 연결 한 단일 호출과 동일 하다. 주어진 경우 인수 비트는 <= 8 * Len (메시지)이어야 하며 메시지의 몇 비트가 해시 되는지 지정한다. 특히, 첫 번째 비트 // 8 전체 바이트 및 다음 바이트의 비트 % 8 최상위 비트가 해시드고, 생략하면 비트의 기본값은 8 * Len (message)이다.
주의 사항 : 지금까지 해시 된 비트 수가 8의 배수가 아닌 경우 비트는 최대 8-hashed_bits % 8의 값으로 지정해야 하고. 그렇지 않으면 Value Error 가 발생한다. 이렇게 하면 후속 해싱 작업의 적절한 바이트 정렬이 보장된다.
  1. digest ( 시작, 정지 ) : 지금까지 처리된 모든 데이터의 다이제스트를 반환하고 통상, 개시 및 정지는 생략 해, 이것은 길이 digest_size의 bytes 오브젝트 되면, 시작 및 정지가 지정되어, 그 결과는 동일하다. () [START : 정지] 다이제스트 하지만 큰 다이제스트의 작은 조각에 대해 더 효율적으로 계산. 예를 들어 스케인을 스트림 암호로 바꾸는 데 유용하다.
  2. hex digest ( ) : 다이제스트 () 이지만, 16진수 문자열로 다이제스트를 반환한다.
  3. copy ( ) : 공통 접두사를 공유하는 데이터의 해시를 효율적으로 계산하기 위해 해시 객체의 복제본을 반환한다.
  4. 이름 : 알고리즘의 이름, 즉 'Skein-256' , 'Skein-512' 또는 'Skein-1024'
  5. block_bits : 내부 상태 크기(비트), 즉 256, 512 또는 1024
  6. block_size : 바이트 단위의 내부 상태 크기 hash lib 준수, 즉 32, 64 또는 128이다.
  7. digest_bits : 출력 다이제스트 길이 (비트 단위), 즉 생성자 함수에 지정된 값(기본값)
  8. digest_size : 다이제스트 크기(바이트)
  9. 해시 비트 : 지금까지 해시 된 메시지 비트 수

예시[편집]

  1. 빈 문자열의 해시 값
Skein-256-256 ( "")
c8877087da56e072870daa843f176e9453115929094c3a40c463a196c29bf7ba
Skein-512-256 ( "")
39ccc4554a8b31853b9de7a1fe638a24cce6b35a55f2431009e18780335d2621
Skein-512-512 ( "")
bc5b4c50925519c290cc634277ae3d6257212395cba733bbad37a4af0fa06af41fca7903d06564fea7a2d3730dbdb80c1f85562dfcc070334ea4d1d9e72cba7a
눈사태효과(disambiguation) 로 인해 메시지가 약간 변경 되더라도 압도적 인 확률로 대부분 다른 해시가 된다.
Skein-512-256 ( " 게으른 개 위에 빠른 갈색 여우가 뛰어 오른다 ")
b3250457e05d3060b1a4bbc1428bc75a3f525ca389aeab96cfa34638d96e492a
Skein-512-256 ( " 게으른 개 위에 빠른 갈색 여우가 뛰어 오른다 .")
41e829d7fca71c7d7154ed8fc8a069f274dd664ae0ed29d365d919f4e575eebb
Skein-512-512 ( " 빠른 여우는 게으른 개로 뛰어 오른다 ")
94c2ae036dba8783d0b3f7d6cc111ff810702f5c77707999be7e1c9486ff238a7044de734293147359b4ac7e1d09cd247c351d69826b78dcddd951f0ef912713
Skein-512-512 ( " 게으른 개 위에 빠른 갈색 여우가 뛰어 오른다 .")
658223cb3d69b5e76e3588ca63feffba0dc2ead38a95d0650564f2a39da8e83fbb42c9d6ad9e03fbfde8a25a880357d457dbd6f74cbcb5e728979577dbce5436
문장의 끝에 마침표를 추가 했다.
  1. 입력 매개 변수 사용
메시지 인증 코드 (MAC)를 생성하려면 키 입력을 사용 할수 있다.
>>> skein256 ( b 'message' ,  key = b 'secret' ) . hexdigest () 
'aee7b931f0e5e134b7af4ac1a7958f5c5f5f7e20dd68cfeab474c0aae0290de7'
개인화 된 해싱을위한 개인화 문자열을 지정할 수 있다.
>>> skein256 ( b 'message' ,  pers = b '20100101 me@example.com' ) . hexdigest () 
'00c4f6aa109902e8db81d4c9324d2980265adcda583090aa894447511ca5f773'
유사하게, nonce는 무작위 화 된 해싱을 위해 지정 될 수 있다.
>>> skein256 ( b 'message' ,  nonce = b 'foobar' ) . hexdigest () 
'e01f8f8d57521f28d08390be94da96390177eff11932eaa59e2976686ac4a280'
디지털 서명의 경우 공개 키는 다이제스트로 해시 될 수 있다.
>>> skein256 ( b 'message' ,  public_key = b 'mypubkey' ) . hexdigest () 
'81a3a49606da1acf1a1ab3324e7ca170f310d905f8fabcff096d4ddf12aeef10'
마지막으로 Skein을 키 파생 함수 (KDF)로 사용하려면 마스터 키를 키로 지정 하고 키 식별자를 key_id 로 지정할 수 있다.
>>> skein256 ( key = b 'mastersecret' ,  key_id = b 'email' ,  digest_bits = 128 ) . hexdigest () 
'c3ad501b1abfcf25bd1bdc4ef4053348'
  1. 트리 해싱
트리 해싱은 순차 해싱과 동일한 증분 인터페이스를 사용하고, 리프 크기가 ​​2 ** L블록으로 해시 하기 위해 노드 당 2 ** F개의 하위 노드와 최대 트리 높이가 M인 팬아웃을 간단히(L, F, M)의 트리 매개 변수로 지정한다.
>>> H  =  skein256 ( 트리 = ( 5 ,  2 ,  255 )) 
>>> 위한  _  의  범위 ( 1000 ) 
...     H . 업데이트 ( b ' \ 0 '  *  10 ** 6 ) 
... 
>>> h . update ( b 'foobar' ) 
>>> h . hexdigest () 
'3d5bea7b8e2ffdaef60ce9d68b1db7cb4549a6bb52b3801eda640623cbeca5bd'
트리 해싱 모드에서 PySkein은 멀티 코어 시스템에서 해싱 속도를 높이기 위해 두 개의 스레드를 사용하는데 트리 해싱에서 생성된 다이제스트는 순차 해싱에서 생성된 다이제스트와 다르며 트리 매개 변수에 따라 달라진다. 상호 운용성 문제로 인해 제약을 받지 않는다면 다른 리프 크기를 사용해 컴퓨터에서 최적의 성능을 발휘할 수 있는 가치를 찾을 수 있다.

각주[편집]

  1. 1.0 1.1 슈나이더 보안 공식 홈페이지 - 〈https://www.schneier.com〉
  2. 티모시, 〈브루스슈나이어의 스케이트 해시기능〉,《Slashdot》, 2008-10-31

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 스케인 문서는 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.