암호화 퀴 변형


22

소스의 MD5 합계를 다음 형식으로 인쇄하는 프로그램을 작성하십시오.

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

부정 행위 없음-소스 파일을 읽고 합계를 계산할 수 없습니다. 프로그램은 외부 정보를 읽지 않아야합니다.

물론 해당 언어에 맞는 MD5 라이브러리를 사용할 수 있습니다.


1
누군가가 MD5를 충돌시킬 경우 (즉, h = f (h), 여기서 f는 인쇄에 필요한 모든 코드 가비지와 함께 h에 대한 "소금"입니다), 그렇게 할 수 있다고 생각합니다.
Nick T

1
@NickT 그래도 매우 어려울 것입니다.
PyRulez

답변:


13

파이썬 157 149

r='r=%r;import md5;print "MD5 sum of my source is: "+md5.new(r%%r).hexdigest()';import md5;print "MD5 sum of my source is: "+md5.new(r%r).hexdigest()

산출:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

이데온 에서의 검증


소스 파일에 대해 다른 md5sum을 얻습니다.
skeevey

@slackwear 무엇을 받고 있습니까?
Matt

오 다시 편집했습니다. 지금 24ba0a79636297dab8803f571d4e3b44 md.py은 리눅스에서 md5sum을 사용합니다
skeevey

1
\n내 프로그램 끝에 줄 바꿈 ( )을 추가하면 @slackwear @ 게시 한 해시가 표시 24ba0a79636297dab8803f571d4e3b44됩니다. 추가 줄 바꿈이 있다고 확신합니다. (저는 일부 편집자가 자동으로이를 수행한다고 생각합니다)
Matt

2
당신이 올바른지. 나는 vim이 후행 LF를 숨길 것이라는 것을 몰랐다
skeevey

12

파이썬 2, 91 바이트

s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s

모든 것을 두 번 반복 할 필요가없는 Python quine 변형 사용 ideone에서 테스트했습니다 .


1
이것은 받아 들일
만한

1

Perl + Digest :: MD5, 89 바이트

$_=q(use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex"\$_=q($_);eval");eval

Digest :: MD5가 TIO에 설치되어 있지 않으므로 TIO 링크가 없습니다. 이를 위해서는 언어 적합성 수준을 5.10 이상으로 설정해야합니다 ( -M5.010; PPCG 규칙에 따라 바이트 패널티는 적용되지 않습니다).

설명

이것은 또 다른 "소스 코드의 함수를 인쇄하는 것"문제이며, 이는 보편적 인 quine 생성자를 통해 쉽게 해결할 수 있음을 의미합니다.

범용 퀴네 생성자

$_=q(…"\$_=q($_);eval");eval

우리는 q()문자열 표기법 (네스트)을 $_사용하여 Perl이 누락 된 인수에 사용하는 "기본"변수 를 초기화 합니다. 그런 다음 eval인수가 누락되어 내부의 문자열 q()이 평가됩니다.

안의 문자열 q()은 전체 프로그램을 작성하는 방법에 대한 설명입니다. 우리는 프로그램의 나머지 부분을 문자 그대로 지정한 다음 이스케이프 처리되지 않은 $_것을 사용 하여 내부의 전체 문자열을 대체합니다.

따라서이 기술은 전체 프로그램 소스와 동일한 내용의 문자열을 만듭니다. 우리는 그것을 인쇄하여 퀴네를 만들 수 있습니다. 그러나 보편적 인 quine 생성자를 만들어서 다른 일을 먼저 할 수도 있습니다.

프로그램의 나머지

use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex

매우 간단합니다 : MD5 내장을 가져온 다음 질문에 지정된 고정 문자열을 인쇄하십시오 (압축 할 가치가 없으며 펄에서는 압축 해제 기가 문자 그대로 문자열을 나타내는 것보다 더 많은 공간을 차지할 것이라고 생각합니다). 범용 quine 생성자를 통해 얻은 문자열


0

Node.js REPL (버전 0.9.3), 96 94 바이트

이 챌린지가 게시되었을 때 존재했던 Node.js의 마지막 버전을 사용합니다. Node.js의 암호화 모듈에 대한 2012 년 11 월 9 일 문서 를 추적 했으며,이 날 다시 사용했던 모든 기능을 지원했습니다.

function x(s){return require("crypto").createHash("md5").update(s+";x(x)").digest("hex")};x(x)

이 코드를 테스트 하기 위해 골동품 버전의 Node.js를 설치 하고 싶지 않다면 최신 버전에서도 작동합니다.

Node.js REPL (버전 7.0.0), 81 바이트

그리고 여기 ES6의 화살표 기능을 사용하는 버전이 있습니다.

x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)

편집 : Node.js 0.9.3 버전의 오류를 지적하여 2 바이트를 절약 한 Anders Kaseorg 에게 감사드립니다 .


사용하는 모든 기능이 Node.js 0.9.3에서 지원되었을 수 있지만 ES6 템플릿 리터럴 구문 `${s};x(x)`은 지원되지 않았습니다.
Anders Kaseorg

@AndersKaseorg 고마워. 템플릿 리터럴을 사용하지 않으면 실제로 Node.js 0.9.3 버전에서 일부 바이트 가 절약 됩니다.
user2428118 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.