VB 实现字符串加密 解密

VB 实现字符串加密 解密,第1张

'如果是将text1中每个字符的asc码值转化为16进制实现加密解密可以这样:复制粘贴下段代码

'加密数据

Private Sub Command1_Click()

Text2Tag = "" '清空text2tag用来存储加密后数据

Text2Text = "" '清空text2用来显示加密后数据

For i = 1 To Len(Text1Text) '将text1中每个字符的asc码值转化为十六进制以软回车chr(13)分隔并存储在text2tag中

Text2Tag = Text2Tag & Hex(Asc(Mid(Text1Text, i, 1))) & Chr(13) '

Next

Text2Text = Text2Tag '显示加密后数据

End Sub

'解密数据

Private Sub Command2_Click()

Text1Tag = ""

Text1Text = ""

Dim b() As String '定义数组用来存储由text1中每个字符转化来的十六进制数

b = Split(Text2Text, Chr(13)) '以软回车符chr(13)分隔text2中文本并存储在数组b中

For i = 0 To UBound(b) '将text2中每个十六进制数转化为十进制的asc码值后转化为字符

Text1Tag = Text1Tag & Chr(Val("&h" & b(i)))

Next

Text1Text = Text1Tag '显示原始数据

End Sub

2) 解密:解密过程与加密过程的顺序正好相反,即从第一个字符开始,每个字符依次反复减去”49632873”中的数字,若执行减法后得到一个负数,则把这个负数加122然后取余,即 (N+122)%122, 其中N为负数。

例如:把xqk解密

(x) 120-4 (q)111-9 (k) 107-6

变为 the

23 其他要求

(1)变量、函数命名符合规范。

(2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。

(3)程序的层次清晰,可读性强。

加密解密的算法都没错,错的是解密程序里的文件 *** 作方法。rewind(fp)没有必要。因为fp已经被close了。一般不推荐同时对一个文件又读又写,因为这样会导致很多缓冲区同步的问题。比如:fputc()和getc()之间,必须要调用fflush(fp);即使这样,还是会有问题。比如回车,getc()可能会返回两个字符,\n和\a。但是用fputc()写入的时候,分别写入\n和\a会把第二行第一个字符覆盖掉。正确的做法是:先把解密的数据保存到字符串里,全部结束之后,一次性把解密完的字符串写到文件里去。voidmain(){charch,name[30];charcontent[1000];intn=0;FILEfp;printf("name:\a");gets(name);fp=fopen(name,"r+");if(fp==NULL){printf("Nofile:%s!\n\a",name);return;}ch=getc(fp);while(ch!=EOF){if((isalpha(ch))!=0){if((ch>='a'&&ch='A'&&ch<='D'))ch=ch+22;elsech=ch-4;}content[n++]=ch;ch=getc(fp);//ch=getc(fp);}content[n]=0;rewind(fp);fprintf(fp,"%s",content);fclose(fp);printf("%sok\a\n",name);printf("content:%s\n",content);printf("\n");}

#include <iostream>

using namespace std;

void main()

{

char yy[256];

char ss[256];

int n;

printf("Is password(Y/N) ");

scanf("%s", yy);

printf("Enter the String ");

scanf("%s", ss);

printf("Enter the key number ");

scanf("%d", &n);

int i;

int length = strlen(ss);

if (yy[0] == 'Y' || yy[0] == 'y')

{

for (i = 0; i < length; i++)

{

if (ss[i] >= 'a' && ss[i] <= 'z')

{

ss[i] -= (n % 26);

if (ss[i] < 'a') ss[i] += 26;

}

else if (ss[i] >= 'A' && ss[i] <= 'Z')

{

ss[i] -= (n % 26);

if (ss[i] < 'A') ss[i] += 26;

}

else if (ss[i] >= '0' && ss[i] <= '9')

{

ss[i] -= (n % 10);

if (ss[i] < '0') ss[i] += 10;

}

}

}

else

{

for (i = 0; i < length; i++)

{

if (ss[i] >= 'a' && ss[i] <= 'z')

{

ss[i] += (n % 26);

if (ss[i] > 'z') ss[i] -= 26;

}

else if (ss[i] >= 'A' && ss[i] <= 'Z')

{

ss[i] += (n % 26);

if (ss[i] > 'Z') ss[i] -= 26;

}

else if (ss[i] >= '0' && ss[i] <= '9')

{

ss[i] += (n % 10);

if (ss[i] > '9') ss[i] -= 10;

}

}

}

printf("%s\n", ss);

}

原因在于你的加密字符(即aryEncode)中间包含了8个空白字符,别小看它们,在进行字符串比较时,它们比其他可见字符都要大!所以造成了当加密字串中含有这些字符以及其后的字符(αβγδ等)时,就会造成错误,程序会直接把加密字符原样显示出来。

当然,你也说了,用ASC函数把字符串比较转为ASCII码比较就能解决问题。

但是,我觉得你这种加密解密的方式很傻(chun),查找一个字符在一个数组中的位置,为什么非要用二分法呢?如果是很大的数组(至少也要上万个元素的),用二分法还可以提高效率,但这么小的数组完全没必要用二分法,由于代码复杂了反而可能降低效率。

下面给你一个能够实现同样效果但却简单得多的代码:

Const CHARNUM = 52

Dim aryCode(CHARNUM) As String

Dim aryEncode(CHARNUM) As String

Private Sub cmdDecrypt_Click()

Dim strChar As String, i As Integer

strChar = txtEncryptText

For i = 0 To CHARNUM

    strChar = Replace(strChar, aryEncode(i), aryCode(i))

Next

txtDecryptText = strChar

End Sub

Private Sub cmdEncrypt_Click()

Dim strChar As String, i As Integer

strChar = txtTextText

For i = 0 To CHARNUM

    strChar = Replace(strChar, aryCode(i), aryEncode(i))

Next

txtEncryptText = strChar

End Sub

Private Sub Form_Load()

Dim i As Integer

aryCode(0) = Chr(32)

For i = 1 To 26

    aryCode(i) = Chr(64 + i)

Next

For i = 27 To CHARNUM

    aryCode(i) = Chr(97 + (i - 27))

Next

For i = 0 To CHARNUM

    aryEncode(i) = Chr(-22879 + i)

Next

End Sub

老早就像编了,只是真有点麻烦,编了一半放弃了,今天进来一看还没解决就把我未完成的给你看看。可能有错误

@echo off

setlocal enabledelayedexpansion

set /p shu=

set yushu=

set zhongshang=

set shang=

set beichushu=

set jieguo=

set base=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

:cal

set beichushu=%yushu%%shu:~0,1%

set shu=%shu:~1,100000%

set /a "shang=beichushu>>24"

set zhongshang=%zhongshang%%shang%

if "%zhongshang%"=="0" set zhongshang=

set /a "yushu=beichushu&0xFFFFFF"

if NOT "%shu%"=="" goto cal

set tt=

set /a "a1=(yushu>>16)&0xFF"

set /a "a2=yushu&0xFF00"

set /a "a3=(yushu&0xFF)<<16"

set /a "a=a1|a2|a3"

if NOT "%zhongshang%"=="" goto b1

if NOT %a2% EQU 0 goto b0

if %a1% EQU 0 goto b2

goto b1

:b0

if %a1% EQU 0 goto b3

:b1

set /a "b=a&077"

set tmp=!base:~%b%,1!

set tt=%tmp%%tt%

set /a "b=a&07700"

set /a "b>>=6"

set tmp=!base:~%b%,1!

set tt=%tmp%%tt%

:b2

set /a "b=a&0770000"

set /a "b>>=12"

set tmp=!base:~%b%,1!

set tt=%tmp%%tt%

:b3

set /a "b=a&077000000"

set /a "b>>=18"

set tmp=!base:~%b%,1!

set tt=%tmp%%tt%

set jieguo=%jieguo%%tt%

set yushu=

set shu=%zhongshang%

set zhongshang=

if NOT "%shu%"=="" goto cal

echo %jieguo%

pause

goto :eof

:eof

你试试看,输入数字就行了,然后想改成从文件读取你自己应该可以吧。解密的还差16进制转10进制。。。好麻烦,不想弄了,要不你看我这个的思路编吧

如果有bug跟我讨论讨论

另附base64 解密

@echo off

setlocal enabledelayedexpansion

set base=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

for /l %%i in (0,1,25) do (

set !base:~%%i,1!=%%i

)

:start

set /p str=

:loop

::每个loop取出4个字符 转成一个24位的数字

set s1=%str:~0,1%

set s2=%str:~1,1%

set s3=%str:~2,1%

set s3=%str:~3,1%

if "%s2%"=="" set s2=A

if "%s3%"=="" set s3=A

if "%s4%"=="" set s4=A

set str=%str:~3,1000%

call ::getnum %s1% num1

call ::getnum %s2% num2

call ::getnum %s3% num3

call ::getnum %s4% num4

echo %num1% %num2% %num3%

set "num1=(num1<<18)||(num2<<12)||(num3<<6)||num4"

set "num1=(num1>>16)||(num1&0xff00)||((num1&0xff)<<16)"

:while

if NOT "%str%"=="" goto loop

goto start

pause

goto eof

:getnum

if "%1"=="+" (

set num=62

goto return

)

if "%1"=="/" (

set num=63

goto return

)

if %1 LSS a goto number

set num=!%1!

if NOT "%1" EQU "!base:~%num%,1!" set /a num=num+26

goto return

:number

set /a num=s1+52

:return

set /a %2=num

:eof

以上就是关于VB 实现字符串加密 解密全部的内容,包括:VB 实现字符串加密 解密、文件的加解密处理、如何对文本/字符串加密解密等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9286500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存