🔓알고리즘/문자열

파일암호화 Cryptography C++

Mawile 2020. 10. 10.
728x90

시작하기 전

사용한 운영체제는 Windows10이며

IDE는 Devcpp를 사용했고, 언어는 C++11입니다!


안녕하세요!

이번에는 파일을 암호화할수있고,

복호화할수있는 프로그램을

만들었습니다

흐헣!!!!

 

이번꺼도 만들면서 꽤 재밌었습니다

소켓이랑 더불어 거의비등하게 재밌었던것같아요!

 

그러면 소스코드와함께 원리설명 바로들어갑니다!

 


[[  암호화  ]]

#include <iostream>
#include <cstring>
using namespace std;

int main(){
	char *ch;
    //암호화된 코드를 저장할변수
	int encp;
    //암호화코드
	string filename,filename_t,thx;
    //원래파일이름,암호화된파일이름,암호화됬을때파일확장자이름저장변수
	cout << "파일경로및 이름을 입력하세요: ";
	getline(cin,filename);
    //띄어쓰기포함 모두입력
	cout << "암호파일의 확장자를 입력하세요: ";
	getline(cin,thx);
	while(1){ //정수가 아닌값 입력 방지 && char범위
		cout << "암호화코드를 입력하세요(1~255): ";
		cin >> encp;
		if(1<=encp&encp<=255) break;
		else cout << "잘못된 코드" << endl;
	}
	int dot = filename.find('.');
    //원래파일이름에서 '.'의 인덱스번호를 찾음
	for(int i=0;i<dot;i++) filename_t += filename[i];
    //.의인덱스번호전까지 값을 옮긴뒤
	filename_t = filename_t + "." + thx;
	//.확장자명 을 추가한다
    
	int size;
    //파일사이즈
	FILE *p;
	p = fopen(filename.c_str(),"rb");
    //읽기전용으로오픈
	if(p==NULL) return 0;
    //없는파일일때는 프로그램끝내기
	fseek(p,0,SEEK_END); //끝으로가서
	size = ftell(p); //파일사이즈재고
	fseek(p,0,SEEK_SET); //다시처음으로돌아온다
	ch = (char*)malloc(sizeof(char) * size); //파일사이즈만큼 동적할당
	fread(ch,sizeof(char),size,p); //파일내용을 읽은뒤 변수 'ch'에 파일내용넣기
	fclose(p);
	
	for(int i=0;i<strlen(ch);i++) ch[i]+=encp; //'ch'내용 암호화
	
	p = fopen(filename.c_str(),"wb"); //쓰기형식으로 파일열기
	if(p==NULL) return 0; //위와같다
	fwrite(ch,sizeof(char),size,p); //암호화된 변수'ch'를 파일내용에 쓰기
	fclose(p); //닫고
	free(ch); //동적할당풀기
	rename(filename.c_str(),filename_t.c_str()); //입력한 암호화된 파일이름으로 이름변경
}

[[  복호화  ]]

#include <iostream>
#include <cstring>
using namespace std;

int main(){
	char *ch;
    //암호화된코드를 저장할 변수
	int decp;
    //복호화코드입력변수
	string filename,filename_t,thx;
    //원래파일이름,복호화된파일이름,암호화하기전 파일확장자이름저장변수
	cout << "파일경로및 이름을 입력하세요: ";
	getline(cin,filename);
    //같다
	cout << "암호화했던 파일의 확장자를 입력하세요: ";
	getline(cin,thx);
    //암호화전 원래파일 확장자명입력
	while(1){ //복호화코드
		cout << "암호화코드를 입력하세요(1~255): ";
		cin >> decp;
		if(1<=decp&&decp<=255) break;
		else cout << "잘못된 코드" << endl;
	}
	int dot = filename.find('.'); //string배열에서 '.'찾기
	for(int i=0;i<dot;i++) filename_t += filename[i]; //암호화때코드랑 일치
	filename_t = filename_t + "." + thx;
	
	int size; //파일사이즈
	FILE *p;
	p = fopen(filename.c_str(),"rb"); //읽기전용
	if(p==NULL) return 0; //없는함수면 나가기
	fseek(p,0,SEEK_END); //끝으로가서
	size = ftell(p); //파일사이즈재고
	fseek(p,0,SEEK_SET); //다시처음으로오기
	ch = (char*)malloc(sizeof(char) * size); //사이즈만큼 동적할당
	fread(ch,sizeof(char),size,p); //암호화된코드를 변수'ch'에 저장
	fclose(p); //파일닫고
	
	for(int i=0;i<strlen(ch);i++) ch[i]-=decp;
    //암호화코드만큼 더해준 했었던만큼 다시 빼주기
	
	p = fopen(filename.c_str(),"wb"); //쓰기전용으로 열기
	if(p==NULL) return 0; //파일존재x -> 나가기
	fwrite(ch,sizeof(char),size,p); //파일사이즈만큼 파일내용쓰기
	fclose(p);
	free(ch); //동적할당풀기
	rename(filename.c_str(),filename_t.c_str()); //원래이름으로 전환
}

 

 

와 설명 다적는데 은근힘드네요

이해가 안가시는분들은 댓글로 질문주세요

감사합니다!

728x90

'🔓알고리즘 > 문자열' 카테고리의 다른 글

C++ | 문자열 안에서 특정 문자열 찾기  (0) 2021.10.17
split 함수 구현 - C++  (0) 2020.12.02

댓글