1.実験名_
古典的な暗号アルゴリズム
2.実験の目的と要件
1. 実験の目的:
プログラミングを通じて換字暗号アルゴリズムと順列暗号アルゴリズムを実現し、古典暗号体系の理解を深めます。
2. 実験要件:
実験内容に従ってタスクを完了してください。暗号アルゴリズムの暗号化および復号化プロセスでは、ユーザーが手動で入力する暗号化プロセスの平文とキー、および復号プロセスの暗号文とキー、および名前を含む文字列が必要です。シーザー パスワードのキー番号は学生番号の下 2 桁であり、行列転置暗号のキーは次に繰り返す学生番号を持つ学生の名前であり、暗号化アルゴリズムと復号化アルゴリズムの実行結果をそれぞれ示します。
3.実験環境
Windows10、Pycharm
4. 実験計画
コンテンツ要件:
- 実験原理と内容
古典的な暗号アルゴリズムは広く使用されており、そのほとんどは比較的単純で、手動および機械操作を使用して暗号化と復号化を実現します。
(1) 代替パスワード
置換暗号アルゴリズムの原理は、置換方式を使用して暗号化すること、つまり、平文内の文字を他の文字に置き換えて暗号文を形成することです。たとえば、平文の文字 a、b、c、d は d、e、f、g に置き換えられて暗号文が形成されます。
置換パスワードには、単一テーブル置換パスワード、複数テーブル置換パスワード、複数文字置換パスワードなど、さまざまなタイプがあります。試作プログラミング 代表的な単一表置換暗号、Caesar(シーザー)暗号を実現します。その暗号化方法は、平文の各文字をアルファベットのこの文字の k 番目の文字に置き換えることです。その暗号化プロセスは次の関数として表現できます。
E(k)=(m+k)modn
このうち、mは平文文字のアルファベット位置番号、nはアルファベット文字数、kは鍵、E(k)は対応する暗号文文字のアルファベット位置番号である。
復号化プロセスも同様です。
(2) パスワードを交換する
順列暗号アルゴリズムの原理は、平文の文字を変更するのではなく、平文内の文字の配列順序のみを変更して、平文情報の暗号化を実現することです。順列暗号は転置暗号とも呼ばれます。
行列転置暗号を実現するプログラミングに挑戦してみましょう。その暗号化方法は、平文内の文字を所定の順序でマトリックスに配置し、キーによって提供される順序に従ってマトリックス内の文字を再結合して暗号文を形成することです。たとえば、平文は攻撃が 5 から始まり、鍵は暗号であり、平文は次のように 1 行あたり 6 文字の形式でマトリックスに配置されます。
攻撃
始まります
五時に
キー暗号の文字がアルファベットに現れる順序に従って順列を与えると、次のようになります。
上記の置換により、元の行列の文字は 1、4、5、3、2、6 の順に配置され、次のようになります。
列形式:
あ、あ、あ、あ、あ、
楽しみます
アイ・ヴィ・フィート
したがって、暗号文を取得します: aacttkbingesaivfte
復号化プロセスも同様です。
- 実験手順
(1) 実験原理の部分における代替暗号アルゴリズムの導入に従って、平文情報を自分で作成し、鍵 k を選択し、代替暗号アルゴリズムの実装プログラムを作成し、暗号化および復号操作を実現します。
(2) 実験原理の部分の順列暗号アルゴリズムの導入に従って、平文情報を自分で作成し、鍵を選択し、順列暗号アルゴリズムの実装プログラムを作成し、暗号化および復号操作を実現します。
3.実験結果
(1) 代替パスワード
暗号化:
復号化:
パスワードを置き換えます:
暗号化:
復号化:
4. 実験概要
この実験では、置換暗号と順列暗号という 2 つの古典暗号アルゴリズムを学習し、暗号化と復号の実験を行い、古典暗号アルゴリズムの基本原理を習得しました。
この実験を通じて、古典的な暗号アルゴリズムと暗号化プロセスの基本原理を学びました。シーザー暗号は単純な置換暗号であり、平文の各文字を特定のオフセットで置き換えることによって暗号文が得られます。順列暗号は、平文の各文字に対して線形変換を実行し、次に置換を実行して暗号文を取得します。これら 2 つのアルゴリズムには一定のセキュリティがありますが、コンピュータ技術の発展に伴い、そのセキュリティは攻撃者によって破られています。
実験では、Python 言語の基本的な構文とプログラミング スキルも学び、Python での置換暗号と順列暗号の実装方法を習得しました。コードを書くことでアルゴリズムの実装プロセスや原理を深く理解し、同時にプログラミング能力も向上しました。
全体として、この実験により、古典的な暗号アルゴリズムについての理解が深まり、プログラミング スキルが向上しました。今後の学習と仕事において、私は引き続き暗号アルゴリズムとプログラミング スキルを学び習得し、情報セキュリティの確保に自ら貢献していきます。
パスワードを置き換えます:
# 加密
def encrypt():
print("-------------加密过程-------------")
text = input("请输入明文:")
s = int(input("请输入秘钥:"))
result = ""
# transverse the plain text
for i in range(len(text)):
char = text[i]
# Encrypt uppercase characters in plain text
if (char.isupper()):
result += chr((ord(char) + s-65) % 26 + 65)
# Encrypt lowercase characters in plain text
else:
result += chr((ord(char) + s - 97) % 26 + 97)
print("加密后的结果为:",result)
print("--------------------------------")
return result
# 解密
def decrypt():
print("-------------解密过程-------------")
text = input("请输入密文:")
s = int(input("请输入秘钥:"))
result = ""
# transverse the plain text
for i in range(len(text)):
char = text[i]
# Encrypt uppercase characters in plain text
if (char.isupper()):
result += chr((ord(char) - s - 65) % 26 + 65)
# Encrypt lowercase characters in plain text
else:
result += chr((ord(char) - s - 97) % 26 + 97)
print("解密后的结果为:", result)
print("--------------------------------")
return result
# 主函数
def main():
x = input("请选择模式(1.加密 2.解密 3.退出):")
while True:
if x == "1":
encrypt()
x = input("请选择模式(1.加密 2.解密 3.退出):")
elif x == "2":
decrypt()
x = input("请选择模式(1.加密 2.解密 3.退出):")
elif x == "3":
break
else:
break
if __name__ == '__main__':
main()
パスワードを置き換えます:
#调用的包
from copy import deepcopy
# 处理密钥获取密钥的长度及顺序
def processSecretKey(s):
sLength = len(s)
tempList = []
for i in range(len(s)):
char = s[i]
# tempList存入密钥单词中字母的ascii码值
tempList.append(ord(char))
# tempList2用于存储密钥单词每个字母在列表的顺序
sKey = []
# sort_tempList用于存储排序后的tempList
sort_tempList = sorted(tempList)
for index_,value in enumerate(tempList):
sKey.append(sort_tempList.index(value)+1)
return sKey,sLength
# 加密
def encrypt():
print("-------------加密过程-------------")
text = input("请输入明文:")
s = str(input("请输入秘钥:"))
# 除去明文中的空格
tempList = text.split(" ")
newText = "".join(tempList)
# 获取处理后明文的长度
textLength = len(newText)
# print("text:",newText)
# 获取密钥及密钥长度
sKey,sLength = processSecretKey(s)
# print(f"sLength:{sLength}")
# print(f"sKey:{sKey}")
# 对于长度不够处理后的明文进行补A处理
while textLength % sLength != 0:
newText+="X"
textLength = textLength + 1
# 更新处理后明文的长度
textLength = len(newText)
# print(f"textLength:{textLength}")
# 根据密钥的长度对明文进行分割
counter = 1
temp = []
tmp = []
for item_ in newText:
if (counter % (sLength) != 0):
tmp.append(item_)
counter+=1
elif (counter % (sLength) == 0):
tmp.append(item_)
temp.append(tmp)
tmp=[]
counter+=1
print("明文矩阵为:")
# 根据密钥对明文进行移位
for item_ in temp:
print(item_)
item_copy = deepcopy(item_)
# print("加密前:",item_)
for i in range(len(item_)):
item_[i] = item_copy[sKey[i]-1]
# print("加密后:",item_)
# 对移位后的明文进行拼接形成密文
print("加密后的密文矩阵为:")
string = ''
for item_ in temp:
print(item_)
string+="".join(item_)
print("加密后的结果为:", string)
print("--------------------------------")
# 解密
def decrypt():
print("-------------解密过程-------------")
text = input("请输入密文:")
s = str(input("请输入秘钥:"))
# 获取密钥及密钥长度
sKey, sLength = processSecretKey(s)
# print(f"sLength:{sLength}")
# print(f"sKey:{sKey}")
# 根据密钥的长度对密文进行分割
newText = text
counter = 1
temp = []
tmp = []
for item_ in newText:
if (counter % (sLength) != 0):
tmp.append(item_)
counter += 1
elif (counter % (sLength) == 0):
tmp.append(item_)
temp.append(tmp)
tmp = []
counter += 1
# print(temp)
print("密文矩阵为:")
# 根据密钥对密文进行移位复原
for item_ in temp:
print(item_)
item_copy = deepcopy(item_)
# print("解密前:",item_)
for i in range(len(item_)):
item_[sKey[i] - 1] = item_copy[i]
# print("解密后:",item_)
# 对移位复原后的密文进行拼接形成明文
print("解密后的明文矩阵为:")
string = ''
for item_ in temp:
print(item_)
string += "".join(item_)
# 除去尾部可能出现的X
string.strip("X")
print("解密后的结果为:", string)
print("--------------------------------")
def main():
x = input("请选择模式(1.加密 2.解密 3.退出):")
while True:
if x == "1":
encrypt()
x = input("请选择模式(1.加密 2.解密 3.退出):")
elif x == "2":
decrypt()
x = input("请选择模式(1.加密 2.解密 3.退出):")
elif x == "3":
break
else:
break
if __name__ == '__main__':
main()