#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资源管理器。
步骤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++对字符串加密解密的简单程序(有注释更好)、加密文件不知道密码怎么解密等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)