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

シーザー暗号

シーザー暗号とは

ある単語・文のそれぞれのアルファベットを 3 文字分ずらして表現する暗号をシーザー暗号という。

例えば、APPLE という単語をシーザー暗号のアルゴリズムを使うとDSSOHとなる。

イメージ図

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

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

イメージ図

プログラム

caesar-cipher.py
def caesar_cipher(input_text: str, direction: str = "encryption"):
input_text = input_text.upper()
base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rot = 3
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 CaesarCipher(props) {
  // 暗号化 or 復号化する文字列
  const inputText = "APPLE";

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

  // 以下は特に変更しなくて良い
  const base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const rot = 3;
  const rotText = base.substring(rot) + base.substring(0, rot);
  function caesarCipher(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
          : caesarCipher(inputText, direction)}
        <span className="mrel" style={{ padding: "5px" }}>
          {direction === "encryption" ? "→" : "←"}
        </span>
        {direction === "encryption"
          ? caesarCipher(inputText, direction)
          : inputText}
      </p>
    </>
  );
}
結果
Loading...