数据结构实践——字符串加密

本文针对数据结构基础系列网络课程(4):串实践项目。

【项目-字符串加密】
  一个文本串可用事先编制好的字符映射表进行加密。例如,设字符映射表为:

abcdefghijklmnopqrstuvwxyz
ngzqtcobmuhelkpdawxfyivrsj

   则字符串“lao he jiao shu ju jie gou”被加密为“enp bt umnp xby uy umt opy”。
   设计一个程序,实现加密、解密算法,将输入的文本进行加密后输出,然后进行解密并输出。

[参考解答](头文件sqstring.h见顺序串算法库

#include <stdio.h>
#include "sqString.h"

SqString A,B; //用于存储字符映射表

SqString EnCrypt(SqString p)
{
    int i=0,j;
    SqString q;
    while (i<p.length)
    {
        for (j=0; p.data[i]!=A.data[j]&&j<A.length; j++);
        if (j>=A.length)            //在A串中未找到p.data[i]字母
            q.data[i]=p.data[i];
        else                        //在A串中找到p.data[i]字母
            q.data[i]=B.data[j];
        i++;
    }
    q.length=p.length;
    return q;
}

SqString UnEncrypt(SqString q)
{
    int i=0,j;
    SqString p;
    while (i<q.length)
    {
        for (j=0; q.data[i]!=B.data[j]&&j<B.length; j++);
        if (j>=B.length)            //在B串中未找到q.data[i]字母
            p.data[i]=q.data[i];
        else                    //在B串中找到q.data[i]字母
            p.data[i]=A.data[j];
        i++;
    }
    p.length=q.length;
    return p;
}

int main()
{
    SqString p,q;
    StrAssign(A,"abcdefghijklmnopqrstuvwxyz");  //建立A串
    StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj");  //建立B串
    char str[MaxSize];
    printf("输入原文串:");
    gets(str);                                  //获取用户输入的原文串
    StrAssign(p,str);                           //建立p串
    printf("加密解密如下:\n");
    printf("  原文串:");
    DispStr(p);
    q=EnCrypt(p);                               //p串加密产生q串
    printf("  加密串:");
    DispStr(q);
    p=UnEncrypt(q);                         //q串解密产生p串
    printf("  解密串:");
    DispStr(p);
    printf("\n");
    return 0;
}

下面的解决有bug,如一楼徐群壮同学所言,以及巩凯强的博文所指。出错原因在于,for循环中的比较,没有考虑找不到时会越界(见注释)。
考虑不周害死猫。编程,认真;认真,编程!

#include <stdio.h>
#include "sqString.h"

SqString A,B; //用于存储字符映射表

SqString EnCrypt(SqString p)
{
    int i=0,j;
    SqString q;
    while (i<p.length)
    {
        for (j=0; p.data[i]!=A.data[j]; j++); //循环条件少加了&&j<A.length
        if (j>=p.length)            //在A串中未找到p.data[i]字母
            q.data[i]=p.data[i];
        else                        //在A串中找到p.data[i]字母
            q.data[i]=B.data[j];
        i++;
    }
    q.length=p.length;
    return q;
}

SqString UnEncrypt(SqString q)
{
    int i=0,j;
    SqString p;
    while (i<q.length)
    {
        for (j=0; q.data[i]!=B.data[j]; j++);//循环条件少加了&&j<B.length
        if (j>=q.length)            //在B串中未找到q.data[i]字母
            p.data[i]=q.data[i];
        else                    //在B串中找到q.data[i]字母
            p.data[i]=A.data[j];
        i++;
    }
    p.length=q.length;
    return p;
}

int main()
{
    SqString p,q;
    StrAssign(A,"abcdefghijklmnopqrstuvwxyz");  //建立A串
    StrAssign(B,"ngzqtcobmuhelkpdawxfyivrsj");  //建立B串
    char str[MaxSize];
    printf("\n");
    printf("输入原文串:");
    gets(str);                                  //获取用户输入的原文串
    StrAssign(p,str);                           //建立p串
    printf("加密解密如下:\n");
    printf("  原文串:");
    DispStr(p);
    q=EnCrypt(p);                               //p串加密产生q串
    printf("  加密串:");
    DispStr(q);
    p=UnEncrypt(q);                         //q串解密产生p串
    printf("  解密串:");
    DispStr(p);
    printf("\n");
    return 0;
}
时间: 2024-09-28 22:42:08

数据结构实践——字符串加密的相关文章

浅谈 DotNet 保护中字符串加密的技术

加密|字符串 学习过了名称混淆,最近又看了一些字符串加密方面的东西.在混淆保护和加密壳中都有字符串加密保护功能. 总体上字符串加密可以分为两类, 第一类是混淆保护中的字符串加密技术.主要特征是修改代码执行路径.大部分混淆保护工具的字符串加密都是这一类. 第二类就是加密壳中的字符串加密技术.这种不用修改IL代码,直接对元数据中的字符串加密.这一类以remotesoft,maxtocode为代表. 先看第一类,加密实现大致如下. 加密前: MessageBox.Show("Hellow World!

C#常用字符串加密解密方法封装代码

 这篇文章主要介绍了C#常用字符串加密解密方法封装代码,有需要的朋友可以参考一下    代码如下: //方法一 //须添加对System.Web的引用 //using System.Web.Security; /// <summary> /// SHA1加密字符串 /// </summary> /// <param name="source">源字符串</param> /// <returns>加密后的字符串</retu

【高分求助】有什么字符串加密解密方法加密之后不是乱码?

问题描述 在C#中,有什么有什么字符串加密解密方法加密之后不是乱码?主要用于文件名加密,所以要求加密之后的字符串是规则的,否则无法用于文件名.另外文件名包括中文和英文.请高手帮忙,谢谢. 解决方案 解决方案二:自定义一个加密规则解决方案三:是不是乱码,自己定,你们的乱码概念,什么是乱码,也知道推敲解决方案四:就是能做文件名,一般的加密算法,加密之后都会有一些特殊字符无法作为文件名用.解决方案五:加密后转16进制形式串,或者其他进制比如0-9a-zA-Z再随便加两个其他符号构成64进制字符串解决方

mac-求银联java MAC字符串加密类

问题描述 求银联java MAC字符串加密类 找了好多MAC加密都是C的,有没有java版的,求一个ansi x9.9 算法的MAC加密类 解决方案 http://blog.csdn.net/lonelyroamer/article/details/7656338 解决方案二: http://download.csdn.net/detail/u010288990/8016707 C++修改为Java很容易,就是指针转数组,一些类型变变,别的基本不用改.参照上面的修改下

用javascript写的字符串加密程序,用if判断程序正常,用switch出错

问题描述 用javascript写的字符串加密程序,用if判断程序正常,用switch出错 大家好,这段代码实现这样的功能: 1.用户输入全是小写字母的字符串,不支持空格和标点符号: 2.程序将字符串中的每个字母,按字母表顺序,向后移动5位,并输出新字符串: <script type="text/javascript"> var str=prompt("请输入要加密的字符串:").split(""); var newStr=[]; v

汇编语言设计字符串加密解密算法

问题描述 汇编语言设计字符串加密解密算法 做一个字符串的加密解密 字符串可以定义成静态的数据段 也可以从键盘动态输入 尽量加上输出 输出加密后的字符 在输出解密后的字符与自己的作比较 ,最好用到宏和子程序

php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法_php技巧

本文实例讲述了php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法.分享给大家供大家参考,具体如下: 由于出于安全考虑,参数传递的时候需要进行加密和解密,一个比较简单的方法是直接使用php中的函数mcrypt_encrypt.mcrypt_decrypt,一个加密,一个解密,但是问题又出现了,这个加密过程中会产生一些使url混乱的符号,于是在加密后对加密字符再进行一次处理,然后多了一一次解析: $key = "miyao";//密钥 $strin

JAVA 字符串加密、密码加密实现方法_java

在我们的程序设计中,我们经常要加密一些特殊的内容,今天总结了几个简单的加密方法,分享给大家! 如何用JAVA实现字符串简单加密解密?为保证用户信息安全,系统在保存用户信息的时候,务必要将其密码加密保存到数据库.  需要使用密码的时候,取出数据,解密处理即可.  避免保存明文密码. 方案一: package com.tnt.util; import java.security.MessageDigest; public class StringUtil { private final static

c++-C++ cryppto 字符串加密

问题描述 C++ cryppto 字符串加密 如果x是仅含两个空格的字符串,x=' ',那么crypto(x)正好等于x,这是为什么,还有其他的含两个字符的字符串经过crypto后不变吗