メインコンテンツまでスキップ

シフト暗号

シフト暗号とは

シーザー暗号ではシフト幅が 3 で固定であった。これを任意の値にしたものをシフト暗号という

例えば、APPLE という単語をシフト暗号(rot = 4)アルゴリズムを使うとETTPIとなる。

イメージ図

今回の例では 4 つずつずらすのでEFGHIJKLMNOPQRSTUVWXYZABCDとなり、元の文字の場所のアルファベットを取得することで暗号化される。

復号化は反対の処理を行うだけで良いので以下の図となる。

イメージ図

プログラム

shift-cipher.py
def shift_cipher(input_text: str, rot: int, direction: str = "encryption"):
input_text = input_text.upper()
base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rot_text = base[rot:] + base[:rot]
ret_text = []
if direction == "decryption":
rot_text, base = base, rot_text
for i in range(len(input_text)):
ret_text.append(rot_text[base.index(input_text[i])])
return "".join(ret_text)

動作

ライブエディター
function ShiftCipher(props) {
  // 暗号化 or 復号化する文字列
  const inputText = "APPLE";

  // 回転数
  const rot = 4;

  // encryption or decryption
  const direction = "encryption";

  // 以下は特に変更しなくて良い
  const base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const rotText = base.substring(rot) + base.substring(0, rot);

  function shiftCipher(inputText, direction = "encryption") {
    inputText = inputText.toUpperCase();
    let retText = "";
    let _base = base;
    let _rotText = rotText;
    if (direction == "decryption") {
      _rotText = base;
      _base = rotText;
    }
    for (let i = 0; i < inputText.length; ++i) {
      retText += _rotText[_base.indexOf(inputText[i])];
    }
    return retText;
  }
  return (
    <>
      <h3>{direction === "encryption" ? "暗号化" : "復号化"}</h3>
      <p>
        {direction === "encryption"
          ? inputText
          : shiftCipher(inputText, direction)}
        <span claclassNamess="mrel" style={{ padding: "5px" }}>
          {direction === "encryption" ? "→" : "←"}
        </span>
        {direction === "encryption"
          ? shiftCipher(inputText, direction)
          : inputText}
      </p>
    </>
  );
}
結果
Loading...