Windows 에서 C\#를 사용 하여 폴 더 와 파일 에 암호 자 물 쇠 를 만 드 는 예제 공유
C\#언어 로 폴 더 잠 금 을 실현 하 는 프로그램 입 니 다.인터넷 에서 비슷 한'xxx 폴 더 xxx'소프트웨어 가 많 지만 대체적으로 C/C+언어 로 이 루어 졌 고 소스 코드 를 제공 하지 않 았 습 니 다.(이것 은 이해 할 수 있 습 니 다.암호 화 프로그램 이기 때문에 소스 코드 를 누설 해 서 는 안 됩 니 다)
프로그램의 기본 원 리 는 C\#언어 로 폴 더 이름 을 바 꾸 고 windows 보안 파일 의 클래스 식별 자 로 이름 을 바 꾸 는 것 입 니 다.구체 적 인 방법 은 폴 더 에 확장 명 을 추가 하 는 것 입 니 다."{2559 a1f2-21d7-11d4-bdaf-00c04f60b9f 0}"
(.{2559 a1f2-21d7-11d4-bdaf-00c04f60b9f 0}은 windows 보안 파일 의 클래스 식별 자 입 니 다)이 때 폴 더 의 아이콘 은 자물쇠 가 되 어 폴 더 가 잠 겨 있 습 니 다.
프로그램의 메 인 화면 은 매우 간결 합 니 다.캡 처 는 다음 과 같 습 니 다.
프로그램 에서 암호 화 된 복호화 폴 더 의 핵심 코드 는 다음 과 같 습 니 다.
private void btnBrowseFolder_Click(object sender, EventArgs e)
{
status = lockType;//
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
DirectoryInfo d = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
string selectedpath = d.Parent.FullName + d.Name;
if (folderBrowserDialog1.SelectedPath.LastIndexOf(".{") == -1)// ,
{
SetPwd(folderBrowserDialog1.SelectedPath);
if (!d.Root.Equals(d.Parent.FullName))
{
d.MoveTo(d.Parent.FullName + "\\" + d.Name + status);//
}
else d.MoveTo(d.Parent.FullName + d.Name + status);
txtFolderPath.Text = folderBrowserDialog1.SelectedPath;
}
else//
{
status = GetStatus(status);
bool s = CheckPwd();
if (s)
{
File.Delete(folderBrowserDialog1.SelectedPath + "\\key.xml");
string path = folderBrowserDialog1.SelectedPath.Substring(0, folderBrowserDialog1.SelectedPath.LastIndexOf("."));
d.MoveTo(path);
txtFolderPath.Text = path;
}
}
}
}
프로그램의 실행 효 과 는 다음 과 같 습 니 다.암호 화 된 D 디스크 아래 test 폴 더 를 예 로 들 면 다음 과 같 습 니 다.
우선 folder BrowserDialog 를 통 해 해당 폴 더 를 선택 하 십시오.
비밀번호 입력,잠 금 추가
효 과 는 다음 과 같 습 니 다:
폴 더 를 더 블 클릭 하면 열 수 없습니다.
암호 화 된 test 폴 더 를 선택 하고 암호 화 할 때 입력 한 암 호 를 입력 하면 잠 금 을 풀 수 있 습 니 다.
test 폴 더 복호화 됨
암호 화 복호화 파일 도구
폴 더 이름 을 조작 하 는 방법 으로 폴 더 의 일반 암호 화 를 실현 하 는 폴 더 암호 화 도구 가 공 유 됐 으 며 폴 더 에 있 는 파일(동 영상,그림 등)이 그대로 저 장 돼 있다.
인터넷 에서 관련 파일 암호 화 프로그램 을 검색 한 결과'문자 창','텍스트'에 대한 암호 화 와 복호화 가 기본 적 인 것 으로 나 타 났 다.비디오 파일,이미지 등 일반 파일 에 대한 암호 화 복호화 프로그램 이 적 기 때문에 일반 파일 을 암호 화 하 는 작은 도 구 를 만 듭 니 다.
프로그램의 주요 기능 은 사용자 가 파일 선택 상 자 를 통 해 암호 화 할 파일-을 선택 하여 암 호 를 입력 하여 암호 화 하 는 것 입 니 다.암호 화 된 파일 을 선택 하고 비밀 번 호 를 입력 하여 복호화 합 니 다.
프로그램의 메 인 화면 은 다음 과 같 습 니 다.
세 단추 의 Click 이벤트 처리 프로그램 은 다음 과 같 습 니 다.
private void btnSelectFile_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
txtFileName.Text = openFileDialog1.FileName ;
}
}
private void btnEncryptFile_Click(object sender, EventArgs e)
{
string inFile=txtFileName.Text;
string outFile = inFile + ".dat";
string password=txtPassword.Text ;
DESFile.DESFileClass.EncryptFile(inFile, outFile, password);//
//
File.Delete(inFile);
txtFileName.Text = string.Empty;
MessageBox.Show(" ");
}
private void btnDecryptFile_Click(object sender, EventArgs e)
{
string inFile = txtFileName.Text;
string outFile = inFile.Substring(0,inFile.Length - 4);
string password = txtPassword.Text;
DESFile.DESFileClass.DecryptFile (inFile, outFile, password);//
//
File.Delete(inFile);
txtFileName.Text = string.Empty;
MessageBox.Show(" ");
}
Help :
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace DESFile
{
/// <summary>
///
/// </summary>
public class CryptoHelpException : ApplicationException
{
public CryptoHelpException(string msg) : base(msg) { }
}
/// <summary>
/// CryptHelp
/// </summary>
public class DESFileClass
{
private const ulong FC_TAG = 0xFC010203040506CF;
private const int BUFFER_SIZE = 128 * 1024;
/// <summary>
/// Byte
/// </summary>
/// <param name="b1">Byte </param>
/// <param name="b2">Byte </param>
/// <returns>true- </returns>
private static bool CheckByteArrays(byte[] b1, byte[] b2)
{
if (b1.Length == b2.Length)
{
for (int i = 0; i < b1.Length; ++i)
{
if (b1[i] != b2[i])
return false;
}
return true;
}
return false;
}
/// <summary>
/// DebugLZQ ,http://www.cnblogs.com/DebugLZQ
/// </summary>
/// <param name="password"> </param>
/// <param name="salt"></param>
/// <returns> </returns>
private static SymmetricAlgorithm CreateRijndael(string password, byte[] salt)
{
PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt, "SHA256", 1000);
SymmetricAlgorithm sma = Rijndael.Create();
sma.KeySize = 256;
sma.Key = pdb.GetBytes(32);
sma.Padding = PaddingMode.PKCS7;
return sma;
}
/// <summary>
///
/// </summary>
private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();
/// <summary>
/// Byte
/// </summary>
/// <param name="count">Byte </param>
/// <returns> Byte </returns>
private static byte[] GenerateRandomBytes(int count)
{
byte[] bytes = new byte[count];
rand.GetBytes(bytes);
return bytes;
}
/// <summary>
///
/// </summary>
/// <param name="inFile"> </param>
/// <param name="outFile"> </param>
/// <param name="password"> </param>
public static void EncryptFile(string inFile, string outFile, string password)
{
using (FileStream fin = File.OpenRead(inFile),
fout = File.OpenWrite(outFile))
{
long lSize = fin.Length; //
int size = (int)lSize;
byte[] bytes = new byte[BUFFER_SIZE]; //
int read = -1; //
int value = 0;
// IV salt
byte[] IV = GenerateRandomBytes(16);
byte[] salt = GenerateRandomBytes(16);
//
SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);
sma.IV = IV;
// IV salt
fout.Write(IV, 0, IV.Length);
fout.Write(salt, 0, salt.Length);
//
HashAlgorithm hasher = SHA256.Create();
using (CryptoStream cout = new CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write),
chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))
{
BinaryWriter bw = new BinaryWriter(cout);
bw.Write(lSize);
bw.Write(FC_TAG);
//
while ((read = fin.Read(bytes, 0, bytes.Length)) != 0)
{
cout.Write(bytes, 0, read);
chash.Write(bytes, 0, read);
value += read;
}
//
chash.Flush();
chash.Close();
//
byte[] hash = hasher.Hash;
//
cout.Write(hash, 0, hash.Length);
//
cout.Flush();
cout.Close();
}
}
}
/// <summary>
///
/// </summary>
/// <param name="inFile"> </param>
/// <param name="outFile"> </param>
/// <param name="password"> </param>
public static void DecryptFile(string inFile, string outFile, string password)
{
//
using (FileStream fin = File.OpenRead(inFile),
fout = File.OpenWrite(outFile))
{
int size = (int)fin.Length;
byte[] bytes = new byte[BUFFER_SIZE];
int read = -1;
int value = 0;
int outValue = 0;
byte[] IV = new byte[16];
fin.Read(IV, 0, 16);
byte[] salt = new byte[16];
fin.Read(salt, 0, 16);
SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);
sma.IV = IV;
value = 32;
long lSize = -1;
// ,
HashAlgorithm hasher = SHA256.Create();
using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read),
chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))
{
//
BinaryReader br = new BinaryReader(cin);
lSize = br.ReadInt64();
ulong tag = br.ReadUInt64();
if (FC_TAG != tag)
throw new CryptoHelpException(" ");
long numReads = lSize / BUFFER_SIZE;
long slack = (long)lSize % BUFFER_SIZE;
for (int i = 0; i < numReads; ++i)
{
read = cin.Read(bytes, 0, bytes.Length);
fout.Write(bytes, 0, read);
chash.Write(bytes, 0, read);
value += read;
outValue += read;
}
if (slack > 0)
{
read = cin.Read(bytes, 0, (int)slack);
fout.Write(bytes, 0, read);
chash.Write(bytes, 0, read);
value += read;
outValue += read;
}
chash.Flush();
chash.Close();
fout.Flush();
fout.Close();
byte[] curHash = hasher.Hash;
//
byte[] oldHash = new byte[hasher.HashSize / 8];
read = cin.Read(oldHash, 0, oldHash.Length);
if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash)))
throw new CryptoHelpException(" ");
}
if (outValue != lSize)
throw new CryptoHelpException(" ");
}
}
}
}
암호 화/복호화 결과:암호 화 D 디스크 에 있 는 1.avi 의 경우 암호 화 된 파일 은 1.avi.dat 이 며,1.avi 파일 로 이름 을 바 꿔 도 열 수 없습니다(파일 이 암호 화 됨).
비밀 번 호 를 입력 하여 복호화 한 후 파일 복호화 가 복구 되 어 순조롭게 열 릴 수 있 습 니 다~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.