1

ファイルを暗号化するための基本的なアルゴリズムを作成しようとしています。文字列内の各文字の ASCII 値を取得し、パスワードの長さに応じて上下に移動します。その後、さらに多くのパスワードを上に重ねることができます。

def encrypt(s):
    lenStr=s.__len__() #used later for working how far the int is moved
    s=list(s) #converts the string to a list
    for x in s:
        s[x]=ord(s[x]) #the same index of the list is = to the value of the string
        s[x]=chr(s[x])#is where it eventualy gets changed back to a str

s=ord(s)エラーをスローしている行です。その周りに int() を追加しましたが、助けにはなりませんでした。同じエラー

4

3 に答える 3

1

x整数ではなく、文字列の文字です。説明しましょう:

>>> s = リスト('abcd')
>>> s の x の場合:
... 印刷 (x)
...
a
b
c
d
>>>

次のように、x を 0 から文字列の長さまでの整数値にする必要があります。

>>> 範囲内の x の場合 (len(s)):
... 印刷 (x)
...
0
1
2
3
>>>

したがって、関数はおそらく次のようになります (テストされていません)。

デフ暗号化:
    lenStr=s.__len__() # int がどこまで移動したかを調べるために後で使用
    s=list(s) #文字列をリストに変換
    範囲内の x の場合 (len(s)):
        s[x]=ord(s[x]) #リストの同じインデックスは = 文字列の値に
        s[x]=chr(s[x])# は、最終的に str に戻される場所です。
于 2013-07-19T14:51:41.023 に答える
1

ステートメント内のの値はリストの要素の 1 つであり、 に渡された文字列引数の個々の文字であるため、TypeError例外が発生します。これを修正するには、たまたま元の文字列と同じ長さのリストのすべての可能なインデックスをループします。xs[x]=ord(s[x])sencrypt()s

def encrypt(s):
    lenStr=len(s)
    s=list(s) # convert the string to a list
    for i in range(lenStr):
        s[i]=ord(s[i])
        s[i]=chr(s[i])

これにより、エラーが発生することなくコードを実行できます。実装しようとしている暗号化アルゴリズムの説明から、注意すべきことの 1 つは、0 ~ 255 の範囲外の不正な 8 ビット文字値を生成することです。mod 演算子%を中間結果に適用して値を適切な範囲に保つだけで、この問題を回避できます。これが私が意味することです:

def encrypt(s):
    lenStr = len(s)
    s = list(s) # convert the string to a list
    for i in range(lenStr):
        s[i] = chr((ord(s[i]) + lenStr) % 256)
    return ''.join(s) # convert list back into a string

同様に、文字列を復号化するときも同じことを行う必要があります。

def decrypt(s):
    lenStr = len(s)
    s = list(s) # convert the string to a list
    for i in range(lenStr):
        s[i] = chr((ord(s[i]) - lenStr) % 256)
    return ''.join(s) # convert list back into a string

enc = encrypt('Gnomorian')
print('encrypted:', enc)
dec = decrypt(enc)
print('decrypted:', dec)

出力:

encrypted: Pwxvx{rjw
decrypted: Gnomorian

また、値が 0 ~ 255 の範囲にあるすべての文字ord()が印刷可能であるとは限らないことにも注意してください。そのため、暗号化変換が必要な場合 (暗号化されたバージョンが印刷可能である必要がある場合) は、さらに制限することをお勧めします。

于 2013-07-19T18:23:16.170 に答える
1

これがあなたが目指しているものだと思います:

def encrypt(s):
    offset = len(s)
    return ''.join(chr(ord(c) + offset) for c in s)

def decrypt(s):
    offset = len(s)
    return ''.join(chr(ord(c) - offset) for c in s)

いくつかのヒント:

  • len(s)の代わりに使用lenStr=s.__len__()
  • コードでの最初の使用に近い値に名前を付けると、読みやすさが向上します。
  • 値の用途を説明する名前を選択してください。
  • 文字列は、リストと同じように反復可能です。文字列をリストに変換する必要はありません。
  • 可能な限りリスト内包表記とジェネレーターを学び、使用してください。通常、それらははるかに高速で、シンプルで、読みやすく、作成する際にエラーが発生しにくいものです。
  • 役立つ回答を受け入れるか、賛成票を投じることを忘れないでください。
于 2013-07-19T15:02:38.047 に答える