82893


以下のコードはまずCaesar codeのアルファベットのずれ具合を調整するn_keyがある。そして、順序が変更されたaからzの文字列がつくられた。  
これに基づいてplainText の 'hello' が暗号化され、printされるが、その前の `ord[i]-97`
の部分が全く理解できません。解説よろしくお願いいたします。

##### caesarEncrypt.py

[code]

    plainText = 'hello'
    n_key = 11
    
    # Shift alphabet by n_keys
    alphabet='abcdefghijklmnopqrstuvwxyz'
    encryptedAlphabet = alphabet[n_key:] + alphabet[:n_key]
    
    # Map plaintext to encrypted alphabet
    cipherText = ''
    for i in plainText:
        cipherText += encryptedAlphabet[ord(i)-97]
    print(cipherText)
    
[/code]


CC BY-SA 4.0
2021-10-05T13:07:41.097
82891
2021-10-06T01:21:36.727
2021-10-05T17:14:20.067
47127
48340
question
python アルゴリズム unicode
Cipher text, Caesar Encryption のコードが理解できない


`for i in
plainText:`のループの中で、現在処理中の文字を格納する変数`i`をコードポイントを表す数値に変換[ord(c)](https://docs.python.org/ja/3/library/functions.html#ord)して、そこから小文字のアルファベット`a`のコードポイントを表す数値`97`を引く処理です。

Pythonで使っているUTF-8は数値で127まではASCIIと同じです。  
英小文字(や英大文字と数字も)は昇順で連続した数値に割り当てられています。  
[ASCIIコード表](https://www.k-cube.co.jp/wakaba/server/ascii_code.html)

上記を行うことで、現在処理中の文字を格納する変数`i`が、`a`を0番目とするアルファベットの順番の何番目にあたるかのインデックス値を計算しています。

そして`encryptedAlphabet`の配列のそのインデックス値の位置の文字を取得すること(`encryptedAlphabet[ord(i)-97]`)で1文字毎の暗号化(シフト化)を行っています。  
[シーザー暗号 -
Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7)

`encryptedAlphabet`は事前に以下の作業によってあらかじめ対応する文字に変換する文字列として用意されています。文字列はまた配列として扱うこともできます。

[code]

    n_key = 11
    
    alphabet='abcdefghijklmnopqrstuvwxyz'
    encryptedAlphabet = alphabet[n_key:] + alphabet[:n_key]
    
[/code]

内容はこちら：

[code]

    'lmnopqrstuvwxyzabcdefghijk'
    
[/code]

これらにより`a`が`l`に、`b`が`m`に変換されていきます。  
というわけで、質問の`hello`は`spwwz`に変換されて表示されます。


CC BY-SA 4.0
2021-10-05T14:36:14.383
82893
2021-10-06T01:21:36.727
2021-10-06T01:21:36.727
26370
26370
82891
answer