'如果是将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 = 52Dim 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 实现字符串加密 解密、文件的加解密处理、如何对文本/字符串加密解密等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)