文本串的加密解密实验

本文介绍了如何使用SqString.h文件实现文本串的加密解密,包括StrAssign,strcpy,strcmp,DispStr等函数的编写,以及通过字母映射表进行加密和解密操作的过程。

实验题目

文本串的加密解密实验

实验内容

  • 一个文本串可用事先给定的字母映射表进行加密。

实验要求

  • 编写Sqstring.h文件,同时实现以下函数:
    • StrAssign():用于生成串
    • strcpy():用于复制串
    • strcmp():用于比较两个串的大小
    • DispStr():用于输出串

实验过程记录

  1. 创建一个名为SqString.h的文件,用于存放串操作的函数声明。
  2. 在SqString.h文件中,声明以下函数:
    • StrAssign():用于生成串
    • strcpy():用于复制串
    • strcmp():用于比较两个串的大小
    • DispStr():用于输出串
  3. 实现这些函数。在主程序中,先定义一个字母映射表,然后根据这个映射表进行加密和解密操作。
  4. 对于加密操作,用遍历来输入的文本串,将每个字符替换为映射表中对应的字符。解密操作则是将加密后的字符替换回原始字符。
  5. 最后,在Main.Cpp里测试所写的串操作函数。输入一个字符串,然后调用加密和解密函数,观察输出结果是否正确。
以下是SqString.h文件的内容:
#include <stdio.h>
#include <string.h>
typedef struct {
    char ch[100];
    int length;
} SqString;

void StrAssign(SqString *str, const char *src) {
    str->length = strlen(src);
    for (int i = 0; i < str->length; i++) {
        str->ch[i] = src[i];
    }
}

void DispStr(const SqString *str) {
    for (int i = 0; i < str->length; i++) {
        printf("%c", str->ch[i]);
    }
    printf("\n");
}

以下是Main.cpp文件的内容:
#include"SqString.h"

int main() {
    char str[10];
    // 原串
    SqString original;
    
    // 密码映射表
    char map[26] = {'n', 'g', 'z', 'q', 't', 'c', 'o', 'b', 'm', 'u', 'h', 'e', 'l', 'k', 'p', 'd', 'a', 'w', 'x', 'f', 'y', 'i', 'v', 'r', 's', 'j'};
    
    // 初始化原串
    printf("初始串:");
    scanf("%s",str);
    StrAssign(&original, str);
    
    // 密码串
    SqString encrypted;
    char c;
    for(int i = 0; i < original.length; i++) {
        c = original.ch[i];
        if(c >= 'a' && c <= 'z') {
            c = map[c-'a']; // 密码替换
        }
        encrypted.ch[i] = c; // 拼接成密文
    }
    encrypted.length = original.length;
    
    // 输出密文
    printf("加密串:");
    DispStr(&encrypted);
    
    // 解密
    for(int i = 0; i < encrypted.length; i++) {
        c = encrypted.ch[i];
        if(c >= 'a' && c <= 'z') {
            for(int j = 0; j < 26; j++) {
                if(map[j] == c) {
                    c = 'a' + j;
                    break;
                }
            }
        }
        original.ch[i] = c; // 恢复原文字母
    }
    
    // 输出解密结果
    printf("解密串:");
    DispStr(&original);
    
    return 0;
}

运行结果
结果如图所示。
在这里插入图片描述

实验总结(个人心得)
通过本次实验,学会运用一个简单的字符串处理库。
在实验过程中,也遇到一些问题,例如如何正确地复制字符串、如何比较两个字符串等。

### 关于加密解密实验的报告示例 #### 实验背景 在现代信息安全领域,Vigenère 密码作为一种经典的多表替换密码,在教学研究中具有重要意义。通过设计并完成 Vigenère 密码的加解密实验,学生可以深入理解其工作原理以及可能的安全隐患。 --- #### 实验目标 熟悉 Vigenère 密码的加密解密过程,并掌握如何利用已知条件破译密文。具体包括以下几个方面: - 掌握 Vigenère 密码的工作机制及其算法实现[^1]。 - 学习基于统计分析的方法来推测密钥长度及内容。 - 编写程序模拟加密解密流程,并验证其实现效果。 --- #### 实验环境准备 为了顺利完成本实验,需准备好如下软硬件资源: - **硬件设备**:一台普通个人电脑即可满足需求。 - **开发工具**:推荐使用 Java 开发环境(如 Eclipse 或 IntelliJ IDEA),也可选用其他编程语言实现核心功能。 - **辅助软件**:浏览器用于查阅资料;文本编辑器或 IDE 支持代码编写调试。 --- #### 实验内容 ##### 1. 明确输入参数 定义以下变量作为实验的基础数据源: - **密钥 (Key)**:由字母组成的一串字符串,例如 `"abc"` 表示周期性的移位规则。 - **明文 (Plaintext)**:待加密的消息,假设只包含小写字母 `'a'-'z'` 空格字符。 - **密文 (Ciphertext)**:经过加密处理后得到的结果。 ##### 2. 加密逻辑描述 对于每一段明文中第 i 个位置上的字符 Pi ,与其对应的密钥中的 Ki 进行 XOR 或 Caesar 替换操作得出 Ci 。如果密钥较短,则重复使用直到覆盖整个消息长度[^1]: ```java public static String encrypt(String plaintext, String key) { StringBuilder ciphertext = new StringBuilder(); int keyLength = key.length(); for(int i=0;i<plaintext.length();i++) { char pChar = plaintext.charAt(i); if(pChar >= 'a' && pChar <= 'z') { // 小写字母范围内的字符才参与运算 char kChar = key.charAt(i % keyLength); char cChar = (char)(((pChar - 'a') + (kChar - 'a')) % 26 + 'a'); ciphertext.append(cChar); } else { ciphertext.append(pChar); // 非字母原样保留 } } return ciphertext.toString(); } ``` ##### 3. 解密逻辑描述 解密过程实际上是逆向执行加密步骤,即恢复原始信息 P_i : ```java public static String decrypt(String ciphertext, String key){ StringBuilder plaintext = new StringBuilder(); int keyLength = key.length(); for(int i=0;i<ciphertext.length();i++){ char cChar = ciphertext.charAt(i); if(cChar>='a'&&cChar<='z'){ char kChar=key.charAt(i%keyLength); char pChar=(char)(((((cChar-'a')-(kChar-'a'))+26)%26+'a'); plaintext.append(pChar); } else{ plaintext.append(cChar); } } return plaintext.toString(); } ``` --- #### 结果展示 选取一组测试案例运行上述函数,观察输出是否符合预期。例如给定 `plaintext="hello world"` `key="abc"` , 应当获得相应变换形式下的密文表示形式。 | 参数 | 值 | |------------|------------------------| | Plaintext | hello world | | Key | abc | | Ciphertext | himmp xpsme | 随后再调用Decrypt 方法传入相同配置项还原初始状态确认一致性。 --- #### 总结思考 通过对本次实验的学习实践可知,Vigenère Cipher 虽然相比单一Caesar Shift 提供更强保护力但由于存在可预测模式仍容易受到频率攻击影响因此实际应用场合有限更多时候充当理论基础角色帮助人们更好认识更复杂体系结构特点. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值