c字元串異或加密
/*本問題的關鍵是如何交換ASCII的二進制位,下面提供簡短演算法,並附上VC++6.0環境下的運行結果截圖。
*/
#include<stdio.h>
charswapbit(charc){
chari,num=0,ch[8];
for(i=0;i<8;i++){
ch[i]=c&1;
c=(c>>1);
}
for(i=0;i<8;i++){
num=2*num+ch[i];
}
returnnum;
}
intmain(){
charch;
for(ch='A';ch<='Z';ch++){
printf("%c=%X:%X ",ch,ch,0XFF&swapbit(ch));
}
return0;
}
㈡ [高分]C語言對字元串的加密和解密
char
ch,name[30],over;
FILE
*fp;
printf("請輸入要加密的文件名(正確的做法是:先把解密的數不知道,你想要什麼樣的加密演算法。
AES不錯。不過AES是對16個位元組長度加密,要是不是16的倍數,處理有點麻煩據保存到字元串里,全部結束之後,一次性把解密
㈢ C語言 文件異或加密
異或加密是所有加密中最容易實施且代碼量相對精簡的一種加密方式,其原理為任意數據被同一個值(key)兩次異或後,值不變。
這種特性,使得異或加密演算法的加解密流程是完全相同的,也就是說加解密可以用同一個函數實現。
一、演算法思路。
依次讀入文件字元,並用key值對其異或,結果輸入到目標文件中。
二、演算法描述。
1 打開源文件及目標文件。
2 獲取密鑰值(key)。
3 讀入一個字元。
4 對其進行異或計算。
5 結果寫入目標文件。
6 重復3-5直到文件結尾。
7 關閉文件。
三、代碼實現。
為使代碼簡潔易懂,輸入文件設定為in.txt, 輸出文件設定為out.txt, key值設定為0x5C。
假定所有文件及目錄可讀寫。
#include<stdio.h>
#defineIN"in.txt"
#defineOUT"out.txt"
#defineKEY0x5C
voidscrambler(constchar*in,constchar*out,unsignedcharkey)
{
FILE*i,*o;
intc;
i=fopen(in,"rb");
o=fopen(out,"wb");//打開文件,因為假定可讀寫,所以對是否成功不做判斷
while((c=fgetc(i))!=EOF)//讀入字元直到文件結尾
{
c^=key;//執行異或加密或解密
fputc(c,o);//寫入文件
}
fclose(i);
fclose(o);
}
intmain()
{
scrambler(IN,OUT,KEY);
return0;
}
但是異或加密也是有缺陷的。最大的缺陷是加密操作是二進制層面的,獲取到的加密文件大部分將是不可讀的亂碼。這也是為什麼在打開文件的時候要以二進制方式的原因。
鑒於此,在此不便給出測試樣例及輸入輸出,可自行調試。
㈣ C語言中最簡單的字元串加密解密問題!!!!希望大家幫幫忙,分不是問題 !!
加密解密的演算法都沒錯,錯的是解密程序里的文件操作方法。
rewind(fp)沒有必要。因為fp已經被close了。
一般不推薦同時對一個文件又讀又寫,因為這樣會導致很多緩沖區同步的問題。比如:
fputc()和getc()之間,必須要調用fflush(fp);
即使這樣,還是會有問題。比如回車,getc()可能會返回兩個字元,\n和\a。但是用fputc()寫入的時候,分別寫入\n和\a會把第二行第一個字元覆蓋掉。
正確的做法是:
先把解密的數據保存到字元串里,全部結束之後,一次性把解密完的字元串寫到文件里去。
void main()
{
char ch,name[30];
char content[1000];
int n = 0;
FILE *fp;
printf("name:\a");
gets(name);
fp = fopen(name,"r+");
if(fp==NULL)
{
printf("No file: %s!\n\a",name);
return;
}
ch = getc(fp);
while(ch!=EOF)
{
if((isalpha(ch))!=0)
{
if((ch >= 'a' && ch <= 'd') || (ch >= 'A' && ch <='D'))
ch = ch + 22;
else
ch = ch - 4;
}
content[n++] = ch;
ch = getc(fp);
//ch = getc(fp);
}
content[n] = 0;
rewind(fp);
fprintf(fp, "%s", content);
fclose(fp);
printf("%s ok\a\n",name);
printf("content: %s\n", content);
printf("\n");
}
㈤ C語言異或加密這個編程怎麼寫
字元A 異或 字元C 在c語言里這樣寫:
char val = 'A' ^ 'C';
㈥ C語言 異或加密
太麻煩了,建議您可以下載文件夾加密超級大師試試。
文件夾加密超級大師支持所有windows系統,可以加密文件夾,加密文件,保護磁碟和數據粉碎,使用起來非常方便。
㈦ C語言字元串加密
問題不小,你表面用的是C
但是,好多地方不符合C的語法
,,比如:
for
(int
i=0;
str[i]
!=
'\0';
i++)
還有,就是你好像沒有弄清楚
,你要做什麼似的,有好多無用的東西,
就像你的函數里的,key
,雖然你提到key了,但是你根本沒有使用key,你只是使用45來進行加密,,還有就是一個文件
的大小,是不確定的,你用一個100個字元的字元串來存,有點那個不安全了,,如果稍長一點就會出問題,產生運行時錯誤。其實你這個加密和解密是一個可逆過程,用一個函數,就可以了,具體你想要的也不是太明白,就給你弄了一個簡單一點加密和解密程序
,輸入輸出不是同一個文件
,不知道是不是你想要的。
#include
#include
#include
void
Decrypt()
{
char
fname[FILENAME_MAX];
char
fname2[FILENAME_MAX];
FILE*
fp;
FILE*
fp1;
int
key;
char
c;
printf("輸入要加/解密文件的路徑:\n");
scanf("%s",
fname);
printf("請輸入密鑰:\n");
scanf("%d",&key);
strcpy(fname2,fname);
strcat(fname2,".txt");
if(
(fp
=
fopen(fname,"r+"))
==
NULL)
{
printf("error");
exit(1);
}
if(
(fp1
=
fopen(fname2,"w+"))
==
NULL)
{
printf("error");
exit(1);
}
while(
(c
=
fgetc(fp))
!=
EOF)
{
c
=
c^key;
fputc(c,fp1);
}
fcloseall();
}
int
main()
{
Decrypt();
return
0;
}
如果想看一些好一點的加密演算法
,我這里有一些,聯系我發給你
,,
㈧ 各位大蝦!小弟在這里跪求幫忙解決一個C++字元串加密解密問題
按你的要求,我剛寫的:
沒有注釋,有問題再交流吧.
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class encrypt
{
public:
encrypt(const char *); //構造函數,加密
~encrypt();
void showcode();
void decrypt(); //解密
private:
char *code;
int length;
};
encrypt::encrypt(const char *string)
{
int i=0;
length=strlen(string);//獲得原字元串的長度
code=new char[length+1];// 加上結束符'\0'
for(;i<length-1;i++) //從第一個字元開始,直到倒數第二個
{
code[i]= string[i] ^ string[i+1]; //加密
}
code[i]= string[i] ^ string[0];//i=length-1,最後一個字元
//跟第一個字元做異或
code[length] = '\0'; //加上結束符
}
encrypt::~encrypt()
{
delete[] code;
}
void encrypt::showcode()
{
for(int i=0;i<length;i++)
printf("%1c",code[i]); //防止'\0',將字元逐個打出.不用iostream
//iostream遇到'\0'會自動結束,,而加密過程中可能中間出現'\0',不該結束
}
void encrypt::decrypt()
{
char p;
cout <<"\nThe First Character:";
cin >> p;
code[length-1] ^= p; //最後一個字元跟第一個再次異或,得到原來的字元(兩次異或,得到原值)
for(int i=length-2; i>=0 ; i--) //從倒數第二個開始
{
code[i]^=code[i+1]; //跟後面一個做異或,得原值
}
cout<<"the original string is:" <<endl;
showcode();
cout <<endl;
}
int main()
{
encrypt e("hello world!");
e.showcode();
e.decrypt();
return 0;
}
㈨ C語言 字元串加密
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intmain(void)
{
charc[100];
intk;
intlen,i,temp;
scanf("%s",c);
scanf("%d",&k);
len=(int)strlen(c);
k=k%26;
for(i=0;i<len;i++)
{
if(c[i]>='a'&&c[i]<='z')
{
if(c[i]+k>'z')
{
temp='z'-c[i];
temp=k-temp-1;
c[i]='a'+temp;
}
else
{
c[i]+=k;
}
}
elseif(c[i]>='A'&&c[i]<='Z')
{
if(c[i]+k>'Z')
{
temp='Z'-c[i];
temp=k-temp-1;
c[i]='A'+temp;
}
else
{
c[i]+=k;
}
}
else
{
/*donothing*/
}
}
printf("%s ",c);
return0;
}