2014-12-03 3 views
0

목록에서 길이가 10 인 문자열을 기반으로 셔플 처리해야하므로 임의의 기능을 사용하지 않고 0-255의 목록을 '섞어 야합니다'. 다음과 같이 현재 할 것은 :사용자 입력을 기반으로 의사 랜덤 테이블 만들기

key = "testtest12" 
mapping = range(256) 

나는 그럼 그냥 비슷한 random.shuffle(mapping) 또는 무언가를 사용하지 않고 mapping 목록 셔플해야합니다. 내가 255에서 고유 한 모든 값을 필요로하는 반면, 그러나 그것은, 값을 중복 리드

keytotal = 0 
for i in key: 
    keytotal += ord(i) 

for i, item in enumerate(mapping): 
    mapping[i] = (mapping[i] * keytotal) % 255 

이 아주 잘 mapping 목록을 섞어 : 내 원래의 아이디어는 같은 키의 모든 조례 값을 추가하는 것이 었습니다 , 그냥 열쇠에 따라 다른 순서로 혼합. 가지고 계신 아이디어가 있으면 보내주십시오.

감사

답변

1

한 가지 방법 : 목록을 진행하고 현재 인덱스 플러스 키에서 문자 중 하나의 ASCII 값을 갖는 요소가 현재 요소를 교환합니다. (목록과 문자열이 필요할 때마다 끝까지 둘러 쌉니다.)

목록이나 키의 길이를 걱정하거나 제한 할 이유가 없습니다. 그래서 아래는 임의의 길이로 작동합니다.

key = "testtest12" 
mapping = range(256) 

keylen = len(key) 
maplen = len(mapping) 

for i, v in enumerate(mapping): 
    c = ord(key[i % keylen]) 
    t = (i + c) % maplen 
    mapping[i] = mapping[t] 
    mapping[t] = v 

경고 : 암호화 관점에서 볼 때 이것은 아마도 쓰레기 일 것입니다.

x
random.shuffle(x, random.seed("testtest12")) 

이 목록은 다음과 같습니다

+0

이것은 암호화에 사용하기위한 것이지만 목록을 아주 잘 뒤섞습니다. 답변 해 주셔서 감사합니다. – Calibre

+1

일반적으로리스트를 셔플하는 것은 암호로 안전하지 않기 때문에 이것은 암호 학습에 대한 할당이라고 생각합니다. –

+0

대체로이 목록을 사용하여 대체 암호를 사용하여 파일을 암호화 한 다음 새로 암호화 한 목록을 최종 암호화를위한 순열 암호로 전달합니다.나는 그것이 가장 안전한 암호화가 될 수 없다는 것을 알고 있지만, 그것이 충분할 것이라고 기대하고있다. – Calibre

2

가장 쉬운 것은 여전히 ​​의사 - 랜덤 번호 생성기와 씨 주어진 문자열을 어느 random를 사용하는 것 같다. 그러면 "testtest12"시드를 기반으로 목록이 뒤섞 일 수 있습니다. 즉 입력에 따라 항상 동일한 셔플 목록이 생성됩니다.

그래서이 작동하는 것 같다 : 파이썬은 기본 난수 생성기와 메르 센 트위스터를 사용하는

import random 
from random import shuffle 
x = [[i] for i in range(0, 255)] 
shuffle(x, random.seed("testtest12")) 
print x 

참고하고, 메르 센 트위스터는 암호 보안 상 안전하지 않을 수 있습니다. 진정으로 암호 학적으로 안전한 난수 생성기를 원한다면 NIST SP800-90A에 정의 된 DRBG 중 하나와 충분히 큰 시드를 사용해야합니다.

+0

고마워, 내가 씨앗과 함께 셔플 기능을 사용할 수 있는지 여부를 확신 할 수 없지만, 그렇다면이 기능은 좋게 보입니다. – Calibre

+1

그래, 이것이 임무라면 다른 대답을 확인하고 싶을 것입니다. :) –

1

256 개의 항목 목록을 적절히 뒤섞기 위해 10 개의 문자열에 엔트로피 (= 임의성)가 충분하지 않습니다. 256이 있습니다! list의 순서가 뒤섞 일 수 있으며, 10 개의 문자열은 그 많은 대안을 담을 수 없다. 시스템에서 결코 닿지 않는 셔플이있을 수 있습니다.

제한된 입력으로 인해 시스템 출력이 제한 될 수 있습니다. 그것은 중요하거나 중요하지 않을 수도 있지만 설계시 고려해야 할 사항입니다.

+0

이것은 좋은 생각을주었습니다. 의견을 보내 주셔서 감사합니다. – Calibre

관련 문제