0

このプログラムを使用して、スペース、句読点を削除し、文字を小文字にします...

def pre_process(s): #Enter: "Jim's secret password."

    s= s.replace("'","")
    s= s.replace('.','')
    s= s.lower()
    s= s.replace(" ","")
    return s

メッセージを暗号化して、各文字が対応するアルファベットの文字と同じ量だけシフトするようにするにはどうすればよいですか? たとえば、5 回シフトしたmはrになりますが、 5 回シフトしたwはbになります。これは私の現在のコードです:

def shift(ch,k):    
    return chr(ord('a')+(ord(ch)-ord('a')+k) % 26)
4

3 に答える 3

1
def shift(ch, k):
    return chr(ord('a') + ((ord(ch) - ord('a')) + 
                           (ord(k) - ord('a'))) % 26)

一種の説明:

def shift(ch, k):
    #
    # k_delta
    # ────>
    #
    # ch_delta                 k_delta
    # ────────────────────────>────>
    # a....f.........m....r....w..zab
    # ──────────────>────>         ┊
    # ch_delta       k_delta       ┊
    #                              ┊
    #                             %26

    ch_delta = ord(ch) - ord('a')
    k_delta = ord(k) - ord('a')
    return chr(ord('a') + (ch_delta + k_delta) % 26)

変わらない限り、暗号化を高速化するためにk使用できます。str.translate

import string
message = 'mw'
key = 'f'
enc_table = string.maketrans(
    string.ascii_lowercase,
    ''.join(shift(c, key) for c in string.ascii_lowercase)
)
message.translate(enc_table) # -> 'rb'

たとえば、マジックナンバー 26を置き換えることもお勧めします。len(string.ascii_lowercase)

復号化は同じ関数を使用して実行できますが、別のキーを使用します。それらの間の関係はそれですenc_delta + dec_delta = 0 modulo 26。この結果から、dec_delta = -enc_delta % 26. したがって:

dec_k = chr(ord('a') + ((ord(enc_k) - ord('a'))) % 26)
于 2015-02-27T05:23:21.387 に答える
0

解読/暗号化 Python

コード:

def shift(ch, k):
    return chr(ord('a') + ((ord(ch) - ord('a')) + (ord(k) - ord('a'))) % 26)


def reshift(ch, k):
    tmp =  (ord(ch) - (ord(k) - ord('a')))
    if tmp<ord('a'):
        tmp = ord("a") +(26 - (ord("a") - tmp))
    return chr(tmp)

print "w and f:"
re = shift("w", "f")
print "Encryption:", re
re = reshift(re, "f")
print "Decrytion:", re

print "----------"
print "e and b"
re = shift("e", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re

print "----------"
print "z and b"
re = shift("z", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re

print "----------"
print "x and b"
re = shift("x", "b")
print "Encryption:", re
re = reshift(re, "b")
print "Decrytion:", re

出力:

vivek@vivek:~/Desktop/stackoverflow$ python 26.py 
w and f:
Encryption: b
Decrytion: w
----------
e and b
Encryption: f
Decrytion: e
----------
z and b
Encryption: a
Decrytion: z
----------
x and b
Encryption: y
Decrytion: x
vivek@vivek:~/Desktop/stackoverflow$ 
于 2015-02-27T19:09:08.300 に答える
0

質問を変更しました。

古い質問によると、次のようになります: Shift('w','f') を 'b' に戻す方法は?

  1. alpha から 2 番目の引数の差を取得しますa。コードは次のとおりです。diff = a2-start
  2. 差を加算して最初の引数から次の値を取得します。コードは次のとおりです。next = a1+diff
  3. 次の値がアルファより大きいzかどうかを確認します。
  4. 大きくない場合z、新しい値は次の値です。
  5. より大きい場合、アルファから新しい値を取得しますa
  6. 戻り値の文字。

コード:

def shift(ch,k):
    start = ord("a")
    end = ord("z")
    a1 = ord(ch)
    a2 = ord(k)

    diff = a2-start
    print "\ndiff:", diff
    next = a1+diff
    print "next value:", next
    if next>end:
        new = next-end-1
        print "new1:", new
        new = start + new  
    else:
        new = next

    print "new value:", new

    return chr(new)


rs = shift("w", "f")
print "w and f:", rs

rs = shift("e", "b")
print "e and b:", rs

rs = shift("z", "b")
print "z and b:", rs

rs = shift("x", "b")
print "x and b:", rs

出力:

vivek@vivek:~/Desktop/stackoverflow$ python 26.py 

diff: 5
next value: 124
new1: 1
new value: 98
w and f: b

diff: 1
next value: 102
new value: 102
e and b: f

diff: 1
next value: 123
new1: 0
new value: 97
z and b: a

diff: 1
next value: 121
new value: 121
x and b: y
vivek@vivek:~/D
于 2015-02-27T03:21:36.653 に答える