JS实现Veginar算法(附源码) | “朝闻道”知识分享大赛

不知名11 2024-10-23 21:07:04

这是我参加朝闻道知识分享大赛的第一篇文章

维吉尼亚密码背景

维吉尼亚密码是一种经典的加密技术,最早由法国外交官布莱斯·维吉尼亚(Blaise de Vigenère)于16世纪提出,尽管其概念可能源自更早的密码技术。它是基于多表代换的原理,通过一个可变长度的密钥对明文进行加密,增强了密码的复杂性和安全性。

维吉尼亚密码是在当时的密码学中引入了一种新的思维方式,取代了简单的替换密码。它利用字母表的循环性质,使得攻击者在进行频率分析时面临更大的挑战。这种加密方式在历史上曾广泛用于军事和外交通信,尽管随着计算机技术的发展,逐渐被更复杂的算法所取代。

实现效果

用户可以输入明文(例如:woshidashuaige)和密钥(例如:nishuodedui),通过点击加密按钮生成密文(例如:jwkocrdwkoivow)。解密时,将密文放入输入框,保持密钥不变,点击解密即可恢复原明文。

 实现原理:

  1. 维吉尼亚密码的原理
    • 维吉尼亚密码是一种基于字母表的多表代换密码。通过使用一个密钥字符串,对明文中的每个字符进行位移,从而得到密文。
    • 每个明文字母与对应的密钥字母共同决定密文字母的位置。如明文字母是 'a',密钥字母是 'b',那么密文字母将是 'b'(即 'a' 向后位移一个位置)。
  2. 加密过程
    • 输入明文字符串和密钥字符串。
    • 明文字符串的每个字符根据密钥字符串中的相应字符进行位移,从而得到密文。
    • 处理时,若明文长度大于密钥长度,则循环使用密钥。
  3. 解密过程
    • 输入密文字符串和密钥字符串。
    • 密文字符串的每个字符根据密钥字符串中的相应字符反向位移,从而得到明文。
  4. 函数设计
    • 加密函数:遍历明文字符,根据密钥字符进行位移得到密文。
    • 解密函数:遍历密文字符,根据密钥字符反向位移得到明文。

关键代码(加解密算法):

  1. 获取字符编码值:通过 inputText.charCodeAt(i) 获取输入文本的第 i 个字符的 Unicode 编码值。
  2. 处理大写字母:如果字符是大写字母(A-Z),则减去 65(即 'A' 的编码值),使得 A-Z 被映射到 0-25。然后与密钥进行运算,最后取模 26,确保结果在 0-25 范围内。
  3. 处理小写字母:与大写字母类似,不过这里处理的是小写字母(a-z),需要减去 97(即 'a' 的编码值)。
  4. 加密操作:根据维吉尼亚密码的原理,将明文字符的编码值与密钥字符的编码值相加,并取模 26,然后再加上 'A' 或 'a' 的编码值,以转换回相应的字母。
  5. 解密操作:与加密相反,需要减去密钥字符的编码值,然后再加上 26,以确保结果为正数。然后进行取模 26,最后再加上 'A' 或 'a' 的编码值,以转换回相应的字母。
  6. 处理非字母字符:如果字符不是字母(例如空格、数字等),则直接将其添加到输出文本中,不进行加密处理。

 

总结

维吉尼亚密码是一种经典的加密算法,以其多表代换的特性和抗频率分析能力而闻名。通过使用可变长度的密钥,它将明文转换为密文,并在解密时通过相同的密钥恢复原文。这种密码技术在16世纪由布莱斯·维吉尼亚提出,历史上被广泛用于军事和外交通信。尽管现代加密技术已更为复杂,维吉尼亚密码仍然是学习密码学的重要基础,帮助理解加密原理和信息安全的重要性。希望通过本篇文章,读者能够掌握其实现过程并激发对密码学的兴趣。

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vigenere</title>
    <link rel="stylesheet" href="Vigenere.css">
</head>
<body>
    <div class="container">
        <h1>维吉尼亚密码</h1>
        <div class="input-group">
            <textarea id="inputText" placeholder="输入要加密/解密的文本"></textarea>
            <textarea id="outputText" placeholder="结果将显示在这里" readonly></textarea>
        </div>
        <div class="key-group">
            <input type="text" id="key" placeholder="输入加密密钥">
            <button onclick="encrypt()">加密</button>
            <button onclick="decrypt()">解密</button>
        </div>
    </div>
    <script src="Vigenere.js"></script>
   
</body>
</html>

CSS代码

body {
   
    display: flex;
    justify-content: center;
    align-items: center;
    height:100%;
    background-color: #f5f5f5;
    margin: 0;
}

.container {
    margin-top: 150px;
    max-width: 600px;
    padding: 20px;
    background-color: #fff;
    border-radius: 8px;
    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}

h1 {
    text-align: center;
    color: #333;
}

.input-group {
    margin-bottom: 20px;
}

textarea, input {
    width: 100%;
    padding: 10px;
    margin-bottom: 10px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-sizing: border-box;
    resize: vertical;
}

button {
    width: 100%;
    padding: 10px;
    background-color: #007bff;
    color: #fff;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    margin-bottom: 10px;
}

button:hover {
    background-color: #0056b3;
}

JavaScript代码

function encrypt() {
    let inputText = document.getElementById('inputText').value;
    let key = document.getElementById('key').value;
    let outputText = '';
    let j = 0;

    for (let i = 0; i < inputText.length; i++) {
        let Code = inputText.charCodeAt(i);
        // 处理大写字母
        if (Code >= 65 && Code <= 90) {
            let keyCharCode = key.charCodeAt(j % key.length);
            let encryptedCharCode = ((Code - 65) + (keyCharCode - 65)) % 26 + 65;
            outputText += String.fromCharCode(encryptedCharCode);
            j++;
        } 
        // 处理小写字母
        else if (Code >= 97 && Code <= 122) {
            let keyCharCode = key.charCodeAt(j % key.length);
            let encryptedCharCode = ((Code - 97) + (keyCharCode - 97)) % 26 + 97;
            outputText += String.fromCharCode(encryptedCharCode);
            j++;
        } 
        // 处理非字母字符
        else {
            outputText += inputText.charAt(i);
        }
    }

    document.getElementById('outputText').value = outputText;
}

function decrypt() {
    let inputText = document.getElementById('inputText').value;
    let key = document.getElementById('key').value;
    let outputText = '';
    let j = 0;

    for (let i = 0; i < inputText.length; i++) {
        let Code = inputText.charCodeAt(i);
        // 处理大写字母
        if (Code >= 65 && Code <= 90) {
            let keyCharCode = key.charCodeAt(j % key.length);
            let decryptedCharCode = ((Code - 65) - (keyCharCode - 65) + 26) % 26 + 65;
            outputText += String.fromCharCode(decryptedCharCode);
            j++;
        } 
        // 处理小写字母
        else if (Code >= 97 && Code <= 122) {
            let keyCharCode = key.charCodeAt(j % key.length);
            let decryptedCharCode = ((Code - 97) - (keyCharCode - 97) + 26) % 26 + 97;
            outputText += String.fromCharCode(decryptedCharCode);
            j++;
        } 
        // 处理非字母字符
        else {
            outputText += inputText.charAt(i);
        }
    }

    document.getElementById('outputText').value = outputText;
}

 

 

...全文
69 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,040

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧