用C语言编程恺撒密码加密解密程序

用C语言编程恺撒密码加密解密程序,第1张

#include <stdioh>

#define isletter( c )    ( ((c)>='a'&&(c)<='z') || ((c)>='A'&&(c)<='Z') )

void Enc( const char str, char out, int key )

{

    int i = 0; 

    while( str[i] )

    {

        if ( isletter( str[i] ) )

        {

            out[i] = str[i] + key;

            if ( ! isletter( out[i])  )

                out[i] -= 26;

        }

        else

            out[i] = str[i];

        i++;

    }

    out[i] = 0;

}

void Denc( const char str, char out, int key )

{

    int i=0;

    while( str[i] )

    {

        if ( isletter( str[i] ) )

        {

            out[i] = str[i] - key;

            if ( ! isletter( out[i] ) )

                out[i] += 26;

        }

        else

            out[i] = str[i];

        i++;

    }

    out[i] = 0;

}

int main()

{

    char  out[100], out2[100];

    Enc( "THE QUICK BROWn fox jumps over THE LAZY DOG", out, 3 );

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

    Denc( out, out2, 3 );

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

}

#include <stdioh>

#include <stdlibh>

#include <stringh>

Encrypt(char cSrc,char cDest)

{

char c;

int i,h,l,j=0;

for (i=0;i<(int)strlen(cSrc);i++)

{

c=cSrc[i];

h=(c>>4)&0xf;

l=c&0xf;

cDest[j]=h+'x';

cDest[j+1]=l+'z';

j+=2;

}

cDest[j]='\0';

return 0;

}

Decrypt(char cSrc,char cDest)

{

int i,h,l,m,n,j=0;

for (i=0;i<(int)strlen(cSrc);i=i+2)

{

h=(cSrc[i]-'x');

l=(cSrc[i+1]-'z');

m=(h<<4);

n=(l&0xf);

cDest[j]=m + n;

j++;

}

cDest[j]='\0';

return 0;

}

main(int argc, char argv[])

{

char dest1[128]="\0";

char dest2[128]="\0";

char src[128]="\0";

printf("请输入源字符串:");

scanf("%s",src);

Encrypt(src,dest1);

printf("加密后的字符串为:%s\n",dest1);

Decrypt(dest1,dest2);

printf("还原后的字符串为:%s\n",dest2);

printf("长度为:%d\n",strlen(dest2));

return 0;

}

方案一:比较繁琐,但是可以试试

步骤1:打开Windows资源管理器。

步骤2:右键单击加密文件或文件夹,然后单击属性。

步骤3:在“常规”选项卡上,单击“高级”。

3弦

步骤4:清除“加密内容以保护数据”复选框。

同样,使用解密时也要注意以下问题:

1要打开Windows资源管理器,请单击开始→程序→附件,然后单击Windows资源管理器。

2解密文件夹时,系统会询问您是否要同时解密文件夹中的所有文件和子文件夹。如果选择仅解密文件夹,则要解密的文件夹中的加密文件和子文件夹将保持加密状态。但是,在解密文件夹中创建的新文件和文件夹不会自动加密。

以上是文件加密和解密的方法!在使用过程中,我们可能会遇到以下问题,解释如下:

1不能使用高级按钮。

原因:加密文件系统“EFS”只能处理“NTFS”文件系统卷上的文件和文件夹。如果您尝试加密的文件或文件夹位于FAT或FAT32卷上,则文件或文件夹的属性中将不会显示“高级”按钮。

解决方案:

使用转换工具将卷转换为NTFS卷。8弦

打开命令提示符。

类型:转换驱动器/fs ntfs

(驱动器是目标驱动器的驱动器号)

2打开加密文件时,会显示“拒绝访问”消息。

原因:加密文件系统“EFS”使用公钥证书加密文件,而与该证书相关的私钥在此计算机上不可用。

解决方案:

找到适当证书的私钥,并使用证书管理单元将私钥导入计算机并在本地使用。

3用户基于NTFS加密文件,重装系统后无法访问加密文件的问题解决方案(注意:重装Win2000/XP前,必须备份加密用户的证书):

第一步:用加密用户登录电脑。

第二步:点击开始→运行,键入mmc,然后点击确定。

步骤3:在控制台菜单上,单击添加/删除管理单元,然后单击添加。

第四步:在“个人管理单元”下,单击“证书”,然后单击“添加”。

8弦

第五步:点击“我的用户账号”,然后点击“完成”(如图二,如果你的加密用户不是管理员,则不会出现此窗口,直接进入下一步)。

第六步:点击“关闭”,然后点击“确定”。

第七步:双击“证书-当前用户”,双击“个人”,然后双击“证书”。

第八步:在“预定用途”一栏中点击带有“加密文件”字样的证书。

步骤9:右键单击证书,指向所有任务,然后单击导出。

第十步:根据证书导出向导的说明,导出PFX文件格式的证书及相关私钥(注意:建议通过“导出私钥”导出证书,这样可以保证证书有密码保护,防止他人窃取。另外,证书只能保存到你有读写权限的目录下)。

4保存证书。

注意保存PFX文件。重装系统后,无论在哪个用户下双击证书文件,都可以导入这个私有证书,访问NTFS系统下该证书原用户加密的文件夹(注意:备份恢复功能备份的NTFS分区上的加密文件夹不能恢复到非NTFS分区)。4弦

最后,该证书可用于以下目的:

(1)允许不同的用户访问加密的文件夹。

将我的证书导出为“导出私钥”,并将其发送给这台机器上需要访问该文件夹的其他用户。然后,他登录,导入证书,并访问这个文件夹。

(2)对由WinXP机器上的“备份恢复”程序备份的先前加密文件夹的恢复访问权限。

用备份恢复程序备份加密文件夹,然后将生成的Backupbkf连同此证书复制到另一台WinXP机器上,用备份恢复程序恢复(注意:只能恢复到NTFS分区)。然后导入证书,就可以访问恢复的文件了。

选项2:

1打开winrar软件,在path中输入你的加密文件所在的路径,就可以看到加密文件了。目录名或文件名可能略有不同,但内容保持不变,可以直接复制使用。

第二,在驱动器d的根目录下新建一个文件夹temp,将加密程序“folder encryptionexe”的副本复制到temp中,然后只需将一个文件复制到temp中备用,然后运行加密程序,输入密码(记住这个密码)进行加密,假设我们忘记加密密码的文件路径是“E:\test”,打开开始菜单,输入CMD,进入命令行模式,输入

copy:\ temp \ thumbs dn \ 117789687 e:\ test \ thumbs dn,回车,会有提示“覆盖

D:\temp\Thumbsdn?”,输入“是”并按enter键。现在忘记加密密码的文件的加密密码是您刚刚加密的密码D:

测试文件密码,直接输入这个密码解密。

选项3:

狡兔洞正式版加密锁30最新无限破解版可供测试。

// playFair 加密 你参考下

#include"stdioh"

#include"stringh"

#include"stdlibh"

#define x 50

char MiYao[x],PassWord[x],AddPass[x],Table[5][5],Map[25];

bool Visit[27]={false};

char English[27]="abcdefghijklmnopqrstuvwxyz";

void Input()

{

printf("请输入密钥:\t"); scanf("%s",MiYao);

printf("请输入待加密密码:\t"); scanf("%s",PassWord);

}

void Fun_5x5()

{

int count = 0,V =0;

/标记密钥内字符为: true/

for(int i=0;MiYao[i]!='\0';i++)

if(strchr(English,MiYao[i])!=NULL)

Visit[strchr(English,MiYao[i])-English] = true;

/执行密钥矩阵 *** 作 并标记已使用字符:true/

for(int i=0;i<5;i++)

for(int j=0;j<5;j++)

{

if(count<strlen(MiYao))

Table[i][j] = MiYao[count++];

else

{

while(Visit[V] != false) V++;

Table[i][j] = English[V];

Visit[V++] = true;

}

}

puts("∞∞∞密钥矩阵为∞∞∞");

for(int i=0;i<5;i++)

{ for(int j=0;j<5;j++)

printf("%3c",Table[i][j]);

puts("");

}

puts("∞∞∞∞∞∞∞∞∞∞∞");

}

int IsVisited(char ch)

{

return Visit[strchr(English,ch)-English]; //false 未出现过

}

void TabletoMap()

{ int count=0;

for(int i=0;i<5;i++)

for(int j=0;j<5;j++)

Map[count++]=Table[i][j];

Map[count]='\0';

}

void Judge()

{

int len = strlen(PassWord),i,j,k;

memset(AddPass,0,sizeof(char));

/一对对去字母,剩下单个字母,则不变化,直接放入加密串中/

if(len%2){

AddPass[len-1] = PassWord[len-1];

len -=1;

}

/一对中 密钥矩阵中 存在矩阵 egab 先输出a同行顶点在输出b同行顶点/

int row1,low1,row2,low2,a1,a2;

for(i=0;i<len;i+=2)

{

char c1,c2;

c1 = PassWord[i];

c2 = PassWord[i+1];

/一对中 两字母相同 无变化/

/一对中 有字母不在密钥矩阵中 无变化/

if(c1 == c2 || ( !IsVisited(c1)||!IsVisited(c2)))

{ AddPass[i] = c1;

AddPass[i+1]=c2;

}else{

a1 = strchr(Map,c1)-Map;

row1 = a1/5; low1 = a1%5;

a2 = strchr(Map,c2)-Map;

row2 = a2/5; low2 = a2%5;

/一对中 字符出现在同行或同列 简单swap字符/

if(row1 == row2 || low1 == low2)

{

AddPass[i] = c2;

AddPass[i+1] = c1;

}else{

AddPass[i] = Table[row1][low2];

AddPass[i+1] = Table[row2][low1];

}

}

}AddPass[len+1]='\0';

puts("加密后字符串:");

puts(AddPass);

puts("原串是:");

puts(PassWord);

}

int main()

{

Input();

Fun_5x5();

TabletoMap();

Judge();

return 0;

}

12种密码破解方法

一、破解CMOSSYSTEM密码

很多品牌机设置了CMOSSYSTEM密码,如果你忘记了密码,你的机器就无法开启,解决方法很简单。步骤如下:

打开机箱,把电池取下、正负极短接,给CMOS放电,清除CMOS中的所有内容(当然也就包括密码),然后重新开机进行设置。

注:品牌机的CMOS清除跳线可能和组装机有差别,必须参照品牌机的说明书来解决问题。

二、破解CMOSSETUP密码

如果你遗忘了CMOSSETUP密码,就不能对CMOS设置进行调整。这个时候你可以进入系统,然后在DOS下面启动DEBUG,输入以下代码清除SETUP密码:

_o7016

_o7116

_q

当然清除CMOSSETUP密码的软件也有很多,例如Cmospwd,它支持Acer、AMI、AWARD、COMPAQ、DELL、IBM、PACKARDBELL、PHOENIX、ZENITHAMI等多种BIOS),在DOS下启动该程序,CMOS密码就会显示出来。

三、破解windows登陆密码

这里介绍windowsXP密码的清除,清除步骤很简单,删除系统安装目录system32config下的SAM文件,重新启动,此时管理员Administrator账号已经没有密码了,用Administrator帐户登陆系统,不用输入任何密码,进入系统后再重新设置登陆帐户密码即可。

四、清除windows屏保密码

在开机后按F8键,选择安全模式启动,进入Windows后,右击桌面空白处,从d出的快捷菜单中选择“属性”/屏幕保护,取消“密码保护”即可。

五、清除windows电源管理密码

Windows的电源管理功能也可以设置密码,启用此功能后,当系统从节能状态返回时就会要求输入密码。

如果你遗忘了该密码,可以使用前面破解Windows登录密码的那种方法去破解。

六、清除微软Office密码

使用破解Office系列文档密码的软件,这样的软件有很多,例如AOPR,该软件可以同时对微软Office系列Word、Excel及Access等软件所生成的密码进行破解,还可以对Word的DOT模板文件的密码进行搜索。

七、清除了WinZip压缩包密码

用软件UZPC(UltraZipPasswordCracker,找回丢失的密码。使用该软件时要先设置适当的解密方式,例如“后门方式”、“穷举方式”、“字典方式”和“模式匹配方式”等,一般采用“BruteForce穷举方式”,然后软件就会对所有可能的密码进行测试,直至找出最后的结果。

八、清除RAR压缩包密码

遗忘了RAR压缩包密码后,你可下载一个CRARK软件来对其进行破解,它主要通过命令行来实现对RAR压缩包的密码进行破解。使用时一般只需直接使用“CRARKRAR压缩包文件名”命令,利用缺省参数即可进行破解。

九、清除QQ/ICQ密码

为保护QQ密码,你应该赶快到这里申请密码保护。假如你忘记了QQ密码、或者密码被盗时,只需填写正确的信息即可取回。

如果你要找回ICQ密码,可以使用软件ICQPasswordRevealer,这是一个DOS下的命令行实用软件,你只需在ICQ安装文件夹的NEWDB子文件夹下执行该文件,然后按照屏幕提示输入自己的UIN,系统即会找回“久违”的ICQ密码。

十、清除OE密码

如果你忘了密码,无法进入OutLookExpress阅读收到的邮件、使用通讯簿等,可以这样破解:重启计算机并按F8,选择“安全模式”,再启动OE就不需要密码了,然后你可以重建一个用户(不能修改密码),把信息导入新用户信箱即可。

十一、清除Foxmail帐户密码

解决方法:消除忘记的Foxmail帐户密码。首先打开Foxmail,新建一个帐户(帐户名任意,例如如lacl1),然后退出Foxmail;运行Windows资源管理器,找到FoxmailMAILlacl1文件夹,里边有个“accountstg”,把它复制到忘记密码的帐户(例如“lacl”)目录中,直接覆盖原来的“accountstg”文件;再重新运行Foxmail,打开忘记密码的帐户,呵呵,怎么连“口令提示框”也没有现在你就可以直接打开忘记密码的帐户,而且帐户中原来的邮件一封都不会少!

十二、查看“”密码

许多密码在屏幕上都是以“”显示的,因此我们无法直接看到密码的原始字符,如果你使用专门破解“”密码的软件,即可查出这些密码的原始字符。

WinXP下可用PasswordSpectatorPro。使用时,只需先打开显示“”的窗口,启动这类软件,然后按住Ctrl键、在密码栏中按下鼠标左键,这些“”密码的原始字符就会显示出来了。

Windows常用密码破解方法

在日常 *** 作中,我们经常要输入各种各样的密码,例如开机时要输入密码,QQ时也要先输入密码,假如你忘记了这些密码,就有可能用不了机器、打不开文件、不能聊天。

也许还会造成很大的损失!下面我们就介绍电脑 *** 作中常用密码的破解方法,希望能解你燃眉之急!

一、遗忘了SYSTEM密码

如果你遗忘了CMOS设置中的SYSTEM密码,就无法启动机器了,解决的办法只能是:打开机箱,把电池取下、正负极短接,给CMOS放电,清除CMOS中的所有内容(当然也就包括密码),然后重新开机进行设置。

注意:有些主板设置了CMOS密码清除跳线,请参照主板说明书将该跳线短接,这样也可以清除CMOS密码。

二、遗忘了SETUP密码

遗忘了该密码,就不能进行CMOS设置了。如果你能使用计算机,但不能进入CMOS设置,可以这样解决:在DOS状态下启动DEBUG,然后输入如下命令手工清除SETUP密码:

_ o 70 16

_ o 71 16

_ q

你也可以 用CMOS密码破解软件来显示CMOS密码,这样的软件有很多,例如Cmospwd(点击下载),它支持Acer、AMI、AWARD、COMPAQ、DELL、IBM、PACKARD BELL、PHOENIX、ZENITH AMI等多种BIOS),在DOS下启动该程序,CMOS密码就会显示出来。

三、遗忘了Windows登录密码

WinMe/98下对策:开机后按F8键选择DOS启动,然后删除Windows安装目录下的PWL密码文件、以及Profiles子目录下的所有个人信息文件,重新启动Windows后,系统会d出一个不包含任何用户名的密码设置框,此时无需输入任何内容,直接单击“确定”,登录密码即被删除。

另外,将注册表数据库HKEY_LOCAL_MACHINE、Network、Logon分支下的UserProfiles修改为“0”,然后重新启动Windows也可达到同样目的。

Word Password Recovery 密码 破解的方法

Word Password Recovery主要就是通过“暴力破解”和“字典破解”两种方法对Word的密码进行破解的。

为了破解的过程更短,就是对破解进行最佳设置。也就是说,最好能知道密码的位置和组合方式。

“字典破解”则要指定一份字典文件,破解的成功率和所选字典文件中是否包含破解Word文档的密码有很大关系。

在设置密码的时候,一般有几种密码,因此可以将自己可能使用的密码添加到TXT或者DIC文件中,在“字典”选项卡中,指定字典文件,这样破解的速度会加快很多。

为了加快破解速度和恢复密码的可能性,可以在“增加引擎”中设置“选择优化级别”和“选择加速级别”选项。

除此之外,破解Word文档密码的软件还有很多,大多数软件原理相同,用户可以根据自己的需要选择使用。

破解电脑密码的方法

一、Outlook Express密码

如果你忘了密码,就没有办法进入OutLook Express查看邮件、使用通讯簿等,破解方法:重启计算机并按F8键,选择“安全模式”,再启动OE就不需要密码了,然后你可以重建一个用户 (不能修改密码),把信息导入新用户信箱即可。

二、Windows屏保密码

解决方法:在电脑开机以后按下F8键,选择安全模式启动,在进入Windows后,在桌面空白处点击鼠标右键,从d出的快捷菜单中选择“属性”/屏幕保护,取消“密码保护”即可。

三、微软Office密码

解决方法:可以利用破解Office系列文档密码的软件,这样的软件在网上也有很多,例如AOPR,这款软件也可以同时对微软Office系列Word、Excel及Access等软件所生成的密码进行破解,还可以对Word的DOT模板文件的密码进行搜索。

四、关于“”密码

许多密码在屏幕上都会以“”显示的,这样我们就没有办法直接看到密码的原始字符了,你可以使用专门破解“”密码的软件,就可以查出这些密码的原始字符了。这样的软件在网上有很多,例如Win2000/Win98下你可用iOpus Password Recovery,WinXP下可用 Password Spectator Pro。使用时,只需先打开显示“”的窗口,启动这类软件,然后按住Ctrl键、在密码栏中按下鼠标左键,这些 “”密码的原始字符就会显示出来了

五、SETUP密码

如果遗忘了该密码,就不对CMOS进行设置了。那么你能使用计算机,却不能对CMOS进行设置,那么可以这样解决:在DOS状态下启动DEBUG ,然后输入如下命令手工清除SETUP密码: _ o 70 16 _ o 71 16 _ q 你也可以利用CMOS密码破解软件来显示CMOS密码,这样的'软件有很多,例如Cmospwd,它支持Acer、AMI、AWARD、COMPAQ、 DELL、IBM、PACKARD BELL、PHOENIX、ZENITH AMI等多种BIOS),在DOS下启动该程序,CMOS密码就会自动显示出来。

六、SYSTEM密码

假如你将CMOS设置中的SYSTEM密码忘记了,那样就没有办法启动电脑了,解决的办法:将机箱打开,把主板电池取下来、将正负极短接,给 CMOS 进行放电,清除CMOS中的所有内容(当然也就包括密码),然后重新启动电脑进行设置。要注意:有些电脑主板设置了CMOS密码清除跳线,一定要参照主板说明书将该跳线短接,这样也可以清除CMOS密码。

用U盘破解XP管理员密码的方法

在Windows启动到要输入密码的时候,当我们按下windows键+U键的时候系统就会启动放大镜程序,就是利用这个放大镜的程序可以让我们对windows的秘密进行破解,不过要说明的是,使用U盘破解win XP管理员密码这个方法只适合FAT32格式,

①制作U盘启动盘。先运行Usboot,然后插入U盘,选中U盘然后点开始。格式化U盘,然后它会提示你再插入,插入U盘1分后就可以了!我的U盘是1G的,用的HDD格式。

②制作替换文件。要制作一个XXEXE的文件来替换原文件,但是这个XXEXE执行后又要达到添加用户的要求。我首先想到的是写一个批处理文件:

@netuserhack123456/add

@netlocalgroupadministratorshack/add

@exit

然后保存为XXbat就可以了!

又有人要问,我们要的是XXEXE为什么却弄个XXbat?

其实我们让它运行XXEXE就等同运行了XXbat就可以了!要达到这样的目的,就要用到winrar,用winrar制作一个自解压文件,不就把XXbat变成XXEXE了吗?运行XXEXE就等同运行了XXbat(把XXEXE拷到U盘上去)

③替换文件到COMS里去把第一启动换到USB-HDD,保存----插入U盘,进入系统的c:\windows\system32下去

执行命令:copymagnifyexe007magnifyexe(此命令的作用就是对magnifyexe进行备份,magnifyexe为放大镜执行程序)在把U盘上的XXEXE拷到system32下,并该为magnifyexe就可以了!

然后从硬盘启动就可以了!再到XP登陆密码时,你只要运行放大镜就可以了!按下Ctrl+Alt+Del(按2次)用你新建的hack用户就可以进去了!进去把管理员密码改过来吧!

PE光盘破解win7开机密码步骤的方法

步骤一、首先将准备的win PE盘插入光驱,然后在bios上设置电脑启动顺序是按照内置光驱为第一启动的方法,这样在电脑启动的时候就会进入pe系统了。

步骤二、找到原系统,可能是c盘和D盘其中一个,然后进入到windows/system32,在其根目录喜爱找到Narratorexe程序文件,然后鼠标右击该文件选择,属性/安全选项,在编辑,选择"组或用户名"为administrators,设置"administrator"权限为"完全控制",并应用。然之后在用前面的方法来对cmdexe程序文件设置权限为“完全控制“。

步骤三、上述 *** 作完成后,把Narratorexe重新改名为Narrator0exe,再把cmdexe也重新改名为Narratorexe。

步骤四、设置完成后,在将电脑重启下,会自动进入到登陆界面,可是密码还是没用破解,还是登陆不上。点击击屏幕左下角“轻松访问中心”启动“讲述人”因为我们更改了系统启动的对象,将其改成了cmdexe。这就是名分提示符程序。

步骤五。然后现在可以在cmd的输入窗口上直接输入命令,先在上输入NET USER rock /add这样就新建了一个用户了。是建立了一个教rock的用户。没用设置密码,然后继续输入ET localgroup administrators rock /add这样就提高了rock用户的权限将其添加到administrator用户组上面了

步骤六、之后重启电脑,进入到登陆界面,还是需要输入密码,因为这是默认的用户administrator用户,所以还是需要输入密码,我们需要切换到rock用户,然后直接登陆即可进入到系统了。因为我们没有给rock设置密码,所以直接就登陆进入系统了。

相信到这里就破解了开机密码了。虽然过程有点麻烦,但是为了能破解电脑密码肯定是要一点手段的。如果那么简单的破解的话,那设置密码就没什么意义了。之后再把narratorexe改回cmdexe再把narrator0exe改回narratorexe,好了!然后进入控制面板/用户管理,删除以前账号的密码。这样是防止别人在没有winpe的情况下再次用同样的方法来破解你的密码。然后再重启电脑,用以前的账号登陆系统,在用户管理上面可以重新设置当前账户的密码。

由于有一个重要的Rar文件,极需解开,首先试用了ARPC,但是解压的速度极慢,每秒只有30个左右,所以断了穷举破解的念头,却仍不死心,因为我从不崇尚穷举破解的方法,除非每秒可以跑几千万次的,我或许可以一试,所以决定研究一下Winrar 3x密码算法,以期是否可以破解该密码。查看了网络上的资料,包括看雪FAQ里的回答,都声称只能用穷举法破解,起先并不理解,但通过研究,我理解了看雪前辈们在FAQ里所说的原因,不禁让我佩服

Winrar加密思路的成熟。虽然研究的结果没有什么新意,但我还是决定把我的研究结果与大家一起分享,为那些仍然以为winrar密码可以象破解注册码一样的,通过修改winrard出框之类的更改文件流程指向可以达到跳过密码检验的朋友,做一个简要的说明。

一、Rar文件生成的流程。

Winrar加密文件时,总的分两个步骤:

 1:先把源文件压缩,压成一段数据段。

 2:再将压缩完的数据段加密。

对于同一个源文件来说,不进行加密,压缩完,其rar文件中的数据段是一模一样的。但是如果对同一个源文件来说,即使使用同一个密码,加密完rar文件中的数据段是不一样的,这是由于加密的密钥是依赖于一个Salt(8个字节的密钥,用来加密时使用,存放在rar文件头中里)

所以要解密rar加密文件关键在于数据解密这一步,那我们接下来研究一下如何加密的。

二、加密“压缩完的数据段”的流程

1、获取密钥:

将明文的密码与Salt一起,通过HASH算法,生成两个16字节的密钥。(一个是KEY(AES算法的参数),一个是initVector)

2、以Key和initVector来加密压缩数据:

这里,是一个循环加密的结构,每16字节作为一个块,进行加密(这可能正是为什么加密完的文件长度总为16倍数的原因)。加密采用AES算法(RAR采用的是AES的rijndael的标准应用)。这里注意:AES加密前,有一个异或运算,是先将每16字节块与上一个16字节块加密结果进行异或,然后再进行AES算法的。我用一个简单的示意代码看说明:

;===============================================

packblock[0]=packblock[i]^initVector

encryptBlock[0]=AES(packblock[0])  ;(KEY为AES的密钥)

for i=1 to 块数量-1

packblock[i]=packblock[i]^encryptBlock[i-1]

encryptBlock[i]=AES(packblock[i]) ;(KEY为AES的密钥)

next

;packblock[i]表示压缩完的每16字节数据

  ;encryptBlock[i]表示加密完的每16字节数据

;===============================================

三、解密的过程

由于AES算法是对称的,所以解密的过程,是加密过程的逆运算。但解密时AES算法过程与加密所用的不一样(是因为解密过程中由KEY生成的子密钥表不一样)。仍然需要我们将密码输入,与salt一起生成两个16字节密钥,KEY和initVector。

;===============================================

packblock[0]=AES1(encryptBlock[0])  ;(KEY为AES的密钥)

packblock[0]=packblock[i]^initVector

for i=1 to 块数量-1

packblock[i]=AES1(encryptBlock[i])  ;(KEY为AES的密钥)

  packblock[i]=packblock[i]^encryptBlock[i-1]

next

;===============================================

那判断密码是否正确的在什么地方呢?

解密的过程是解密后的数据块进行解压缩,然后解成源文件,对该文件进行CRC校验,存在RAR文件中的源文件CRC校验码比较,相同则密码正确,不相同则密码错误。

四、无法秒破的原因

从上面,我们了解了RAR文件的整体思路。地球人都知道,解密时,肯定有个步骤是来判断密码的正确与否。而且,依据以往的经验,我们也许可以将某些判断的点移动,那样可以缩减破解的流程思路。那RAR的这一步在哪里?它把校验放在了最后的一步。如果要秒破,我们该怎么做泥?至少我认为目前是不可能的。

我们从解密过程逆反过来看看:

1、CRC检验这一块修改跳转?根本毫无意义,因为它已经是最后一步了。你可以修改RAR文件头的CRC值,你可以将它改得和你用任意密码解压出来的文件CRC值一样,但你的文件根本就不是原来的文件了。可能已经完全面目全非了。所以,对这一过程不可行。CRC校验本身是不可逆的

2、那么把判断提前到压缩完的数据?

解压的时候,有没有什么来判断压缩数据是否正确?压缩完的数据,有没有固定的特征,是否可以做为解压的判断,在这一步里,我们也无法找到有效的可用的固定特征。因为这一步涉及到RAR的压缩算法。即使一个源文件,即使你的文件前一部分是完全相同的,只对后面的部分进行改过,那么压缩完,数据也是完全一样的。因为压缩完的数据首先是一个压缩表,后面是编码。文件不一样,扫描完的压缩表也不一样,编码又是依赖于压缩表,所以,这里头找不到压缩完的数据有任何的固定特征可以用来判断的。

不管压缩数据是什么样的,Winrar都一如既往地进行解压,没有进行压缩数据是否有效的判断。

3、那假如我们破解了AES了泥?

由于AES只依赖于KEY,如果AES算法被破解了,我们知道了KEY,我们可以解出压缩完的数据,但是这里有一个问题,还有一个initVector密钥,用来第一个16字节块的异或,你没有initVector参数,你第一个16字节块的数据便无法解得出来。

4、那就只能从第一步Hash的算法入手

即使你能破解hash,但hash后的结果泥?没有结果,你怎么返推密码。

所以综上,我发现rar的加密是由hash和AES两种算法互相牵制,而两种算法当前都无法破解,至少目前还没有办法秒破,也理解了看雪高手讲的道理。

五、对穷举提高算法效率的一些设想。

我用汇编写完了RAR穷举解密的算法模块,但是如何提高效率,优化穷举的速度泥?我有如下的想法:

1、从压缩数据里找寻特征,省掉解压缩、CRC检验代码和生成initVector生成代码。目前,通过多次实验,我找到的一个特征(不知道这个是否正确),即解密完的最后一个16字节块的最后一个字节必须为0。因为经过多次的试验,我发现有加密的数据段长度都会比未加密前的数据长,那么,最后一个

16个字节的数据块解密完,多出的部分就都为0,但多出几个字节泥?多次实验,长度不一,我试想着从加密数据段最后一个16个字节块着手,只解这一块,看是否一个字节为0,这样,只解密16个字节的数据,来大大提高效率?如果能进行到这一步了,再通过解全部数据,进行CRC校验的判断。

2、如果第一个特征不成立的话,针对特定格式的压缩文件,比如doc、jpg等,部分数据固定,压缩完的数据是否存在相互牵制的数据?从而把判断提前,这一步,我不知道如何找到压缩完的数据是否存在相互牵制的数据。

可能很长 ,这是在我以前一个程序里摘出来的。

原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的 ASCII码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的ascII码减一 在与你输入的密码比较,正确既可以进入。

#define CODE_SIZE 10

int password()

{

FILE fp;

char s1[CODE_SIZE], s2[CODE_SIZE], s3[CODE_SIZE], fun;

while (1)

{

fp = fopen("passwordtxt", "r");

if (fp == NULL)

{

printf("第一次运行,请输入初始密码(最多8位):\n");

scanf("%s", s1);

printf("请再次输入初始密码:\n");

scanf("%s", s2);

if (strcmp(s1, s2) == 0)

{

fp = fopen("passwordtxt", "w+");

if (fp == NULL)

{

printf("创建文件失败退出\n");

getch();

exit(1);

}

else

{

//对s1加密

for (int i = 0; i<CODE_SIZE&&s1[i] != ' '; i++)

{

s1[i] = s1[i] + i;

}

fputs(s1, fp);

printf("初始密码创建完成\n");

}

}

else

{

printf("两次输入的密码不一致!\n");

}

fclose(fp);

}

else

{

fgets(s1, CODE_SIZE, fp);

fclose(fp);

printf("输入密码:\n");

scanf("%s", s2);

//对s1解密

for (int i = 0; i<CODE_SIZE&&s1[i] != ' '; i++)

{

s1[i] = s1[i] - i;

}

loop:

if (strcmp(s1, s2) == 0)

{

printf("-----密码正确-----\n");

printf("-----请选择功能-----\n");

printf("-----1:修改密码-----\n");

printf("-----2:进入通讯录-----\n");

scanf("%d", &fun);

switch (fun)

{

case 1: printf("请输入新密码\n");

scanf("%s", s1);

printf("请再次输入新密码\n");

scanf("%s", s2);

if (strcmp(s1, s2) == 0)

{

fp = fopen("passwordtxt", "w+");

if (fp == NULL)

{

printf("文件错误!\n");

}

else

{ //对s1加密

for (int i = 0; i<CODE_SIZE&&s1[i] != ' '; i++)

{

s1[i] = s1[i] + i;

}

fputs(s1, fp);

fclose(fp);

printf("密码修改成功\n");

}

}

else

{

printf("两次输入的密码不一致,修改失败\n");

}

break;

case 2: return 1;

default: printf("无效指令\n");

}

}

else

{

printf("密码错误\n请重新输入\n");

scanf("%s", s2);

goto loop;

}

}

printf("------------------\n\n\n\n");

}

}

// 以下程序在VC60 Win7环境下测试通过,可加密文本文件和二进制文件。

// Enpexe 输入文件名 输出文件名 密钥

// 加密 Enpexe 1txt 1enp 1234

// 解密 Enpexe 1enp 1txt 1234

#include <iostream>

#include <fstream>

using namespace std;

#include <mathh>

#include <conioh>

int KEY = 234; //密钥可以随便改。

/ 加密16字节的密码(不足16字节也按16字节加密) /

int EncryptPassword(char oldpwd[16],char newpwd)

{

int i;

char tmp[16];

memset(tmp,sizeof(tmp),0);

memcpy(tmp,oldpwd,16);

int p=(int)tmp;

int len = sizeof(int)/sizeof(char);

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

{

p[i] ^= KEY;

}

memcpy(newpwd,tmp,16);

return 1;

}

void ShowHelp(char appName)

{

printf("\t%s\t输入文件名\t输出文件名\t密钥\n",appName);

printf("加密\t%s\t1txt\t\t1enp\t\t1234\n",appName);

printf("解密\t%s\t1enp\t\t1txt\t\t1234\n",appName);

}

int main(int argc, char argv[])

{

char stFileName[256],stFileOut[256];

char binBlock[16],binEnBlock[16];

int nRead=0;

long nTotal,nCur,nLastPercent=0;

if(argc < 2)

{

cout << "请输入输入文件名:";

cin >> stFileName;

}

else

{

if(strcmp(argv[1],"/")==0)

{

ShowHelp(argv[0]);

exit(0);

}

strcpy(stFileName,argv[1]);

}

if(argc < 3)

{

cout << "请输入输出文件名:";

cin >> stFileOut;

}

else

{

strcpy(stFileOut,argv[2]);

}

if(argc < 4)

{

int tkey;

cout << "请输入密钥(0表示使用默认密钥):";

cin >> tkey;

if(tkey != 0)

KEY = tkey;

}

else

{

KEY = atoi(argv[3]);

}

FILE fpin = fopen(stFileName,"rb");

FILE fpout = fopen(stFileOut,"wb");

if (NULL == fpin)

{

printf("文件%s打开失败!\n",stFileName);

exit(0);

}

fseek(fpin,0L,SEEK_END);

nTotal = ftell(fpin);

//printf("Len=%ld\n",ftell(fpin));

//getch();

fseek(fpin,0L,SEEK_SET);

printf("已完成: 0%");

while(!feof(fpin))

{

memset(binBlock, 0, sizeof(binBlock));

nRead = fread(binBlock,1,16,fpin);

nCur = ftell(fpin);

if(nCur100/nTotal > nLastPercent)

{

nLastPercent = nCur100/nTotal;

printf("\b\b\b\b%3d%%",nLastPercent);

}

if(nRead==16)

{

//printf("1\n");

}

else

{

//printf("2\t%d\n",nRead);

binBlock[nRead] = 0;

}

EncryptPassword(binBlock,binEnBlock);

fwrite(binEnBlock,nRead,1,fpout);

}

printf("\n");

fclose(fpin);

fclose(fpout);

return 0;

//ofstream fout("OutPuttxt",ios::out|ios::binary);

}

以上就是关于用C语言编程恺撒密码加密解密程序全部的内容,包括:用C语言编程恺撒密码加密解密程序、急求用c/c++对字符串加密解密的简单程序(有注释更好)、加密文件不知道密码怎么解密等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存