암호화 알고리즘을 구현해봤는데, 속도가 안나오네요.
AES 및 DES를 (c로) 구현 해보고 있습니다. 암복호화는 잘 되는데 문제가 생겼습니다. 바로 암복호화에 걸리는 속도인데요, 주어진 알고리즘대로 잘 작동하면 encryption 또는 decryption 속도야 알고리즘 상에 문제이겠거니 했건만, 제가 작성한 코드에 문제가 있나봅니다. 다른 사람이 작성한 코드와 속도를 비교해보려고 openssl에 포함된 AES및 DES를 가져와 적절히 고친후 컴파일하였습니다. 그리고 제가 작성한 AES및 DES와 openssl의 AES및 DES의 encryption 및 decryption 속도를 비교해 보았습니다. 다음과 같은 결과가 나오는군요..
────── / encryption time /────/ decryption time
openssl AES─/ 335.245 Mbps /────/ 331.427 Mbps
자작 AES──/ 2.241 Mbps /─────/ 0.975 Mbps
openssl DES─/ 259.481 Mbps/────/ 259.148 Mbps
자작 DES──/ 1.434 Mbps /─────/ 1.441 Mbps
(Mbps: 초당 encryption 및 decryption 처리 bit수)
자작한 알고리즘이 제대로 암복호화 된다고 좋아했는데, 좋아할만한 일이 아니였더군요.
코딩이 부족한 탓도 있겠지만, 저런 암호화 알고리즘 최적화에 관련해서 참고할만한 책 또는 좋은 소스 없을까요?
어설픈 코딩을 탓하며 great code 1, 2권을 도서관에서 빌려다 보고 있는 중이긴 합니다.
(kldp에 표만들기는 어떻게 하나요?;; 그냥 탭으로 구분지어 올리려 했는데 이상하게 탭이 인식이 안되고 다닥다닥 글자가 붙어나오길래 ── ──/ 이런식으로 처리하게 되었네요..)
컴파일러 호스트 설정을 바꿔보시는 것은 어떻겠습니까?
분명 glibc 가 사용하고 계신 CPU의 Extended Instruction Set 을 모두 지원하지 않는 탓일겁니다.
병렬처리와 파이프라이닝을 고려하여 프로그램을 구축하신다면, 멋진 구현이 가능하리라 생각합니다.
또 개인적으로 사파리 책 중, Intel Threading Block Building 책을 보시면 도움이 되실거라 생각합니다.
====
하나는 전부, 전부는 하나
?
오래된 글이지만, AES 는 고속 연산을 위해 일종의 대응 테이블을 만들 수 있도록
고안된 알고리즘이기 때문에 암호화 알고리즘 자체를 설명하는 글에 나오는 대로
그대로 구현하면 당연히 속도가 느립니다.
OpenSSL 소스를 보면 Te, Td 같은 테이블이 있습니다. 이를 통해 알고리즘을 최적화할 수 있습니다.
Openssl을 보세요.
Openssl을 보세요.
AES도, DES도 모두 대응테이블이 따로 필요합니다.
대응 테이블은 SBox와 쉬프트 등의 연산을 몰아서 한번에 해버린 결과를 매핑 시켜 놓은 것입니다.
암호화 알고리즘을 A & B & C = A& (B&C)와 같이 연산 순서가 상관 없는 부분을 먼저 처리해 놓은 것이라고 생각하면 이해하기 편하실 겁니다.
Openssl에는 적당한 주석으로 설명들이 존재하기 때문에 openssl 소스가 좋은 공부 자료가 될 것 같습니다.
그리고 컴파일 옵션 확인해보세요. 최적화 옵션에 따라, 혹은 디버그 모드인지, 릴리즈 모드인지에 따라 성능은 천차만별입니다.
==================================
당신은 당신의 꿈을 위해 무엇을 희생하였나요?
학습이 목적이라 의미가 있을지 모르겠지만 AES는
학습이 목적이라 의미가 있을지 모르겠지만
AES는 intel cpu에 인스트럭션으로 들어가 있습니다.
AES-NI 도 함께 공부해 보시길 권해 드립니다.
댓글 달기