문제

수년, 아마도 10년 동안 저는 암호화에 매료되었습니다.나는 XOR 비트 기반 암호화에 관한 책을 읽었고 그 이후로 계속 매료되었습니다.

다양한 암호화 방법을 깰 수 있는 사람들에게 매료됐다고 말하는 것이 더 타당할 것 같지만, 저는 빗나갑니다.

요점 - 암호화를 작성할 때 어떤 방법을 사용합니까?암호화에서 난독화가 좋은가요?

두 개의 키 기반 XOR 암호화, 키에 대한 다양한 해싱 기술(SHA1), 여기 저기 문자열 반전과 같은 간단한 작업을 사용합니다.

나는 독창적이지 않은 암호화 방법을 작성할 때 다른 사람들이 어떻게 생각하고 시도하는지 보고 싶습니다.또한 전문가들이 다양한 암호화 기술을 "파괴"하는 방법에 대한 정보도 흥미로울 것입니다.

명확히 하자면, 나는 이것을 프로덕션 코드나 그 문제에 대한 내 코드에서 사용하고 싶지 않습니다.나는 바퀴를 재발명하는 것이 아니라, 놀면서 그것이 어떻게 작동하는지 배우는 것이 흥미롭습니다.:)

이안

도움이 되었습니까?

해결책

지금까지 다른 사람들이 말한 것과 모순되기 위해, 그것을 위해 가십시오! 예, 귀하의 코드에는 버퍼 오버플로 취약점이 있을 수 있고 속도가 느리거나 버그가 있을 수 있습니다. 재미있는!나는 암호화폐를 가지고 놀 때 느끼는 레크리에이션의 즐거움을 완전히 이해합니다.

즉, 암호화는 난독화에 전혀 기반을 두지 않습니다(또는 적어도 그렇게 해서는 안 됩니다).좋은 암호화폐는 한 번이라도 계속 작동할 것입니다. 이브 난독화된 코드를 자세히 살펴보고 무슨 일이 일어나고 있는지 완전히 이해했습니다.즉:많은 신문이 대체 코드 독자들이 아침 식사를 하면서 시도하고 깨는 퍼즐입니다.만약 그들이 전체 문자열을 뒤집는 것과 같은 일을 시작한다면, 그렇습니다. 더 어려울 것입니다. 하지만 Joe Reader는 여전히 그것을 깨뜨릴 수 있을 것입니다.

좋은 암호화폐는 (아직 입증되지 않은 AFAIK) 정말 어렵다고 가정되는 문제를 기반으로 합니다.이에 대한 예는 다음과 같습니다. 소수 인수분해, 로그를 찾아서, 또는 실제로 다른 것 NP-완전 문제.

[편집하다:스냅, 둘 다 아니야 입증된 NP-완전.그것들은 모두 입증되지 않았지만 다릅니다.당신이 여전히 내 요점을 이해하기를 바랍니다.암호화폐는 단방향 기능을 기반으로 합니다.이는 하기 쉽지만 실행 취소하기는 어려운 작업입니다.즉, 두 숫자를 곱하고 제품의 소인수를 찾는 것입니다.좋은 캐치 tduehr]

정말 멋진 수학 분야를 가지고 놀 수 있는 더 많은 힘을 얻으세요. 암호화폐는 복잡하지 않고 어려운 것에 기반을 두고 있다는 점을 기억하세요.많은 암호화 알고리즘은 일단 실제로 이해하면 놀라울 정도로 단순하지만 문자를 바꾸는 것이 아니라 어려운 것에 기반을 두고 있기 때문에 여전히 작동합니다.

메모:즉, 일부 알고리즘은 무차별 대입을 훨씬 더 어렵게 만들기 위해 추가 특성(예: 문자열 분리)을 추가합니다.내 일부는 내가 이 글을 어딘가에서 참고해서 읽은 것 같은 느낌이 든다. DES, 하지만 믿을 수가 없어요...[편집하다:내가 옳았어, 봐봐 이 글의 5번째 문단 순열이 쓸모없다는 점을 언급하기 위해.]

지금:아직 발견하지 못했다면 아마도 /엑스티/XXTEA 일련의 알고리즘이 흥미로울 것입니다.

다른 팁

제가 드릴 수 있는 최선의 조언은 다음과 같습니다.바퀴를 재발명하려는 유혹에 저항하십시오.암호화는 생각보다 어렵습니다.

Bruce Schneier의 책 받기 암호화 적용 그리고 주의 깊게 읽어보세요.

정답은 이런 일을하지 않는 것입니다.가장 좋은 방법은 이 목적을 위해 시중에 나와 있는 많은 암호화 라이브러리 중 하나를 선택하여 애플리케이션에서 사용하는 것입니다.모호함을 통한 보안은 결코 작동하지 않습니다.

암호화 알고리즘에 대한 현재 최고 표준도 선택하세요.암호화의 경우 AES, 해싱의 경우 SHA256입니다.공개 키에 대한 Elgamal.

Applied Cryptography를 읽는 것도 좋은 생각입니다.그러나 책의 대부분은 대부분의 애플리케이션에 필요하지 않은 구현에 대한 세부 정보입니다.

편집하다:편집에 제공된 새로운 정보를 확장합니다.현재 암호화의 대부분은 복잡한 수학을 많이 포함하고 있습니다.온갖 종류의 비트를 뒤섞는 것처럼 보이는 블록 암호도 동일합니다.

이 경우 Applied Cryptography를 읽고 책을 구하세요. 응용암호학 핸드북 무료로 다운로드할 수 있습니다.

이들 둘 다 암호화 알고리즘에 들어가는 내용에 대한 많은 정보를 가지고 있습니다.차등 및 선형 암호 분석과 같은 것에 대한 설명입니다.또 다른 자원은 시테시어 여기에는 다운로드할 수 있도록 두 책 모두에서 참조한 학술 논문이 많이 있습니다.

암호학은 엄청난 학문적 역사를 지닌 어려운 분야로 어디든 갈 수 있습니다.그러나 당신이 기술을 가지고 있다면 그것은 내가 찾은 것처럼 꽤 보람있는 일입니다.

여기에서 연습을 해보세요:

http://www.schneier.com/crypto-gram-9910.html#SoYouWanttobeaCryptographer

우선 큐브 어택 페이퍼(http://eprint.iacr.org/2008/385) 그리고 그것으로 일부 알고리즘을 깨뜨려보십시오.암호화 체계를 깨는 방법에 익숙해지면 해당 체계를 만드는 데 더 능숙해질 것입니다.

프로덕션 코드에 관해서는 이미 말한 내용을 반복하겠습니다.모든 주류 체계는 이미 여러 차례의 암호 분석을 거쳤기 때문에 시장에 있는 것을 사용하세요.

위의 모든 조언은 타당합니다.난독화가 나쁘다.먼저 대중이 한동안 사용하도록 허용하지 않고 자신의 암호화폐를 생산에 투입하지 마십시오.

추가할 몇 가지 사항:

  • 인코딩은 ~ 아니다 암호화.최근 개발자들의 오해로 인해 웹사이트의 인증 시스템을 우회했습니다.

  • 가장 기본적인 시스템도 깨뜨릴 수 있는 방법을 알아보세요.간단한 회전 암호에 대한 지식이 실제로 얼마나 자주 유용한지 놀랄 것입니다.

  • A^B = C.두 개의 키 XOR 암호화를 사용하고 있다고 말씀하셨습니다.암호화 시스템을 구축할 때 항상 단계가 실제로 무언가를 달성하고 있는지 확인하십시오.두 키 XOR의 경우 실제로는 다른 키를 사용하는 것입니다.

  • A^A = 0.XOR 암호화는 알려지거나 선택된 일반 텍스트 공격에 대해 매우 약합니다.일반 텍스트의 전부 또는 일부를 알고 있으면 키의 전부 또는 일부를 얻을 수 있습니다.평문 ^ 암호문 = 키

  • 읽기 좋은 또 다른 책은 Simon Singh의 The Code Book입니다.그는 암호화의 역사 중 일부와 그가 다루는 대부분의 암호화 시스템을 해독하는 방법을 살펴봅니다.

  • 학습해야 할 두 가지 알고리즘(이들과 그 뒤에 숨겨진 역사를 학습하세요):

    • 3DES:예, 더 이상 사용되지 않지만 fiestel 및 블록 암호를 배우기 위한 좋은 출발점이며 DES에서 생성하는 데 좋은 교훈이 있습니다.또한 사용된 암호화, 복호화, 암호화 방법론에 대한 추론도 배우는 것이 좋습니다.
    • RSA:여기에 내 내면의 수학 괴짜를 보여 드리겠습니다.아마도 오늘날 사용되는 가장 간단한 암호화 알고리즘일 것입니다.이를 깨는 방법은 알려져 있지만(단지 키만 고려하면) 계산상 매우 어렵습니다.m^d mod n 여기서 n = p*q(p 및 q 소수) 및 gcd(d,n)=1입니다.약간의 그룹/수 이론은 p와 q를 모르면 이것이 쉽게 되돌릴 수 없는 이유를 설명합니다.내 정수론 과정에서 우리는 이 이론을 최소한 6가지 방법으로 증명했습니다.

PhirePhly에 대한 참고 사항:

소인수 분해와 이산 로그는 NP-Complete 또는 NP-Hard가 아닙니다.둘 다 복잡성이 알려져 있지 않습니다.그 부분만 알아내면 상당한 명성을 얻을 수 있을 것 같아요.즉, 나머지 주장은 정확합니다.좋은 암호화폐는 하기는 쉽지만 키 없이는 실행 취소하기 어려운 일을 기반으로 합니다.

해당 분야의 전문가가 아닌 이상, 생산 제품에 집에서 만든 암호화폐를 사용하지 마세요.충분했다.

하지 않다!

전문가들조차 가지고 있는 매우 그들이 제대로 했는지 알기가 어렵습니다.암호화 CS 클래스 외부에서는 다른 사람의 코드를 사용하세요.반드시 필요한 경우에만 코드를 포팅하고 알려진 좋은 코드로 콧물을 테스트하세요.

대부분의 전문가들은 암호화 방법과 알고리즘을 개발할 때 난독화보다 개방성이 더 가치 있다는 데 동의합니다.

즉, 자신을 제외한 모든 사람이 깨뜨릴 수 있는 새로운 코드를 누구나 설계할 수 있는 것 같습니다.최고의 암호화폐는 알고리즘과 일부 암호화된 메시지를 내보내고 최고의 암호화폐 해커가 이를 깨려고 시도하는 테스트를 거쳐 살아남습니다.

일반적으로 대부분의 난독화 방법과 단순 해싱(저도 그 중 상당수를 직접 수행했습니다)은 매우 쉽게 깨집니다.그렇다고 해서 실험하고 배우는 것이 재미없다는 의미는 아닙니다.

암호학 서적 목록 (위키피디아에서)

현재 다시 읽고 있기 때문에 이 질문이 눈에 띄었습니다. 크립토노미콘 닐 스티븐슨(Neal Stephenson)의 소설이지만 개요 자체는 나쁘지 않습니다.

(후손을 위해) 다른 모든 사람을 반영하려면 절대 자신의 암호화폐를 구현하지 마십시오.도서관을 이용하세요.

즉, DES를 구현하는 방법에 대한 기사는 다음과 같습니다.

http://scienceblogs.com/goodmath/2008/09/des_encryption_part_1_encrypti.php

순열과 노이즈는 많은 암호화 알고리즘에 매우 중요합니다.요점은 사물을 모호하게 하는 것이 아니라 무차별 대입 공격을 비현실적으로 만드는 프로세스에 단계를 추가하는 것입니다.

또한 다운로드하여 읽어보세요. 암호화 적용.정말 좋은 책이에요.

다른 포스터에 동의해야 합니다.당신이 그것에 관한 논문을 작성하거나 조사를 해야 하는 경우가 아니라면 하지 마십시오.

당신이 그것에 대해 많이 알고 있다고 생각한다면 가서 읽어보십시오. 암호화 적용 책.나는 수학을 많이 알고 있는데 그 책은 여전히 ​​내 엉덩이를 걷어찼다.그의 의사 코드를 읽고 분석할 수 있습니다.이 책의 뒷면에는 원하는 경우 더 깊이 파고들 수 있는 수많은 참고 자료가 있습니다.

암호화폐는 많은 사람들이 매우 멋지다고 생각하는 것 중 하나이지만 개념 뒤에 숨겨진 실제 수학은 이해하기 어렵습니다.나는 오래 전에 그 수준에 도달하는 데 정신적 노력을 기울일 가치가 없다고 결정했습니다.

이것이 어떻게 수행되는지 보고 싶다면(기존 코드 구현을 연구) 다음을 살펴보는 것이 좋습니다. 암호화++ 라이브러리 일반적으로 C++로 코딩하지 않더라도 암호화 구현에 대한 주제와 부분을 잘 볼 수 있습니다.

브루스도 좋은데 자원 목록 그의 사이트에서 얻을 수 있습니다.

저는 올해 Aus TechEd에서 코드 보안 세션에 참석했습니다..Net의 AES 알고리즘과 그것이 어떻게 선택되었는지에 대해 이야기할 때 발표자(Rocky Heckman)는 이전 암호화를 깨는 데 사용되었던 기술 중 하나를 알려주었습니다.누군가가 열화상 카메라를 사용하여 데이터를 암호화하는 동안 CPU의 열 신호를 기록했습니다.그들은 이 기록을 사용하여 칩이 수행하는 계산 유형을 확인한 다음 알고리즘을 리버스 엔지니어링할 수 있었습니다.그들은 시간이 너무 많았고 나는 그런 사람들을 이길 만큼 똑똑하지 못할 것이라고 확신합니다!:(

  • 메모:나는 진심으로 내가 이야기를 정확하게 전달하였기를 바란다. 만약 그렇지 않다면, 그 실수는 언급된 발표자의 실수가 아니라 내 실수일 가능성이 크다.

집에서 재배한 암호화폐를 제품에 사용하면 안 된다는 것은 이미 정설입니다.하지만 귀하의 질문을 읽었으며 귀하는 단지 재미로 하고 있다는 점을 분명히 밝혔습니다.나에게는 진정한 괴짜/해커/학문 정신처럼 들립니다.당신은 그것이 작동한다는 것을 알고 있고 그것이 왜 작동하는지 알고 싶고 그것을 작동시킬 수 있는지 확인하려고 노력합니다.

나는 그것을 전적으로 권장하며 단지 재미로 작성한 많은 프로그램에 대해서도 동일한 작업을 수행합니다.이 게시물을 읽는 것이 좋습니다 (http://rdist.root.org/2008/09/18/dangers-of-amateur-cryptography/) "rootlabs"라는 블로그를 방문하세요.게시물에는 매우 흥미로운 일련의 링크가 있습니다.컴퓨터 과학 박사 학위를 갖고 수학/암호화폐에 관심이 있고 Google에서 일하는 한 남자가 암호화폐 프로그래밍에 관한 일련의 기사를 쓰기로 결정했습니다.그는 업계 전문가인 Nate Lawson이 지적한 몇 가지 명백하지 않은 실수를 저질렀습니다.

꼭 읽어보시길 권합니다.계속해서 노력하도록 격려하지 않더라도 의심할 여지 없이 여전히 뭔가를 가르쳐 줄 것입니다.

행운을 빌어 요!

나는 바퀴를 다시 발명하지 않는다는 데 동의합니다.

그리고 모호함을 통한 보안은 전혀 보안이 아니라는 점을 기억하십시오.보안 메커니즘의 일부에서 "아무도 이것을 알아낼 수 없습니다!"라는 문구를 사용하면 안전하지 않습니다.AES에 대해 생각해 보세요. 알고리즘은 공개적으로 사용 가능하므로 여러분 알고 있다 정확히 그것이 어떻게 작동하는지, 그러나 누구도 그것을 깨뜨릴 수 없습니다.

다른 답변에 따르면, 암호화 체계를 고안하는 것은 확실히 전문가들의 일이며 새로 제안된 암호화 체계는 실제로 그 견고성에 대한 합리적인 희망과 확신을 얻기 위해 공개 조사를 받아야 합니다.그러나 기존 알고리즘과 시스템을 구현하는 것은 "재미를 위한" 훨씬 더 실용적인 노력이며 모든 주요 표준에는 구현의 정확성을 입증하는 데 도움이 되는 좋은 테스트 벡터가 있습니다.

즉, 프로덕션 솔루션의 경우 기존 구현이 풍부하며 일반적으로 그렇게 할 이유가 없습니다. 필요 시스템을 직접 구현해 보세요.

나는 모든 답변에 동의합니다. "자신만의 암호화 알고리즘을 작성하지 마세요 생산용" 및 "그래, 너 자신의 교화를 위해 노력해라", 그러나 존경하는 브루스 슈나이어(Bruce Schneier)가 자주 쓴 글이 생각납니다."누군가 자신이 깨뜨릴 수 없는 것을 만드는 것은 쉽습니다."

비전문가가 제대로 작동할 것으로 기대할 수 있는 유일한 암호화는 매우 간단한 One Time Pad 암호화입니다.

CipherTextArray = PlainTextArray ^ KeyArray;

그 외에도 볼 만한 가치가 있는 모든 것(레크레이션용이라도)에는 높은 수준의 수학 학위가 필요합니다.

나는 이미 주어진 정답에 대해 깊이 들어가고 싶지 않습니다(프로덕션을 위해 하지 마십시오;단순한 반전만으로는 충분하지 않습니다.난독화가 나쁘다;등).

나는 Kerckoff의 원칙인 "키를 제외한 시스템에 관한 모든 것이 공개된 지식이라 할지라도 암호 시스템은 안전해야 한다"라는 원칙을 추가하고 싶습니다.

그 동안 Bergofsky의 원리(Digital Fortress에서 Dan Brown이 인용)에 대해서도 언급하겠습니다."컴퓨터가 충분한 키를 시도하면 올바른 키를 찾는 것이 수학적으로 보장됩니다.코드의 보안은 암호 키를 찾을 수 없다는 것이 아니라 대부분의 사람들이 시도할 시간이나 장비가 없다는 것입니다."
그러나 그것은 본질적으로 사실이 아닙니다.댄 브라운이 해냈습니다.

인수분해의 복잡성에 대해 PhirePhly 및 tduehr에 응답:

인수분해가 NP와 coNP에 있음을 쉽게 알 수 있습니다.우리가 확인해야 할 것은 "주어진 n과 k에서 1 < p <= k를 사용하여 n의 소인수 p를 찾는 문제"와 "그런 p가 존재하지 않음을 보여 주는 문제"가 모두 NP에 있다는 것입니다(첫 번째는 결정 변형임). 두 번째는 보완의 결정 변형입니다).

첫 번째 문제:후보 해 p가 주어지면 우리는 쉽게(즉,다항식 시간) 1 < p <= k인지, p가 n을 나누는지 확인합니다.해 p는 n보다 항상 더 짧습니다(이를 표현하는 데 사용되는 비트 수). 따라서 인수분해는 NP입니다.

두 번째 문제:완전한 소인수 분해(p_1, ..., p_m)가 주어지면 그 곱이 n이고 1과 k 사이에 아무 것도 없는지 빠르게 확인할 수 있습니다.PRIMES가 P에 있다는 것을 알고 있으므로 다항식 시간에서 각 p_i의 소수성을 확인할 수 있습니다.가장 작은 소수는 2이므로 유효한 인수분해에는 최대 log_2(n)개의 소인수가 있습니다.각 요소는 n보다 작으므로 최대 O(n log(n)) 비트를 사용합니다.따라서 n이 1과 k 사이의 소인수를 갖지 않으면 신속하게(다항식 시간) 검증할 수 있는 짧은(다항식 크기) 증명이 있습니다.

따라서 인수분해는 NP와 coNP에 있습니다.NP-완전이라면 NP는 coNP와 같을 것이며 이는 종종 거짓으로 간주됩니다.이것을 인수분해가 실제로 NP-완전하지 않다는 증거로 받아들일 수 있습니다.차라리 증거를 기다리는 것이 낫습니다 ;-)

보통 저는 정수론 박사학위부터 시작합니다.그런 다음 나는 10년 정도 연구를 하고 많은 출판과 동료 검토를 통해 후속 조치를 취합니다.내가 사용하는 기술은 내 연구와 동료의 다양한 기술입니다.가끔 한밤중에 일어나면 새로운 기술을 개발하고, 구현하고, 그 안에 있는 구멍을 찾아내고(수론과 컴퓨터 과학 동료들의 도움을 받아) 거기에서 개선해 나가곤 합니다.

쥐에게 알고리즘을 주면...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top