
Simple and sane cryptographic wrapper library.
AdvSim.Cryptography NuGet에는 재사용 가능하고 합리적인 기본값으로 구성되어 사용하기 쉬운 일련의 암호화 래퍼 함수가 포함되어 있습니다. 자세한 내용은 아래의 각 소제목에서 확인할 수 있습니다.
AdvSim.Cryptography NuGet은 다양한 .Net 버전을 지원합니다. 일반적으로 라이브러리에 포함된 함수는 대상 프레임워크 전반에 걸쳐 우수한 지원 범위를 제공합니다. 특정 프레임워크로 제한되는 함수에는 해당 종속성을 강조하는 배지가 추가되어 있습니다.
NuGet URL: https://www.nuget.org/packages/AdvSim.Cryptography
암호화 생성자의 일부로 키 자료가 제공되는 경우 Rfc2898DeriveBytes를 사용하여 암호화 및 복호화 작업을 시드하는 의사 난수 바이트 배열을 반환합니다. 이 바이트 배열은 품질이 높을 뿐만 아니라 동일한 키 자료로 동일한 함수를 호출하면 동일한 의사 난수 시드가 생성되도록 보장합니다.
이 함수는 바이트 배열을 받아 생성자에서 제공된 키 자료를 사용하여 암호화하거나 복호화합니다. 완료되면 바이트 배열을 반환합니다.
AES test = new AES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
이 함수는 바이트 배열을 받아 생성자에서 제공된 키 자료를 사용하여 암호화하거나 복호화합니다. 완료되면 바이트 배열을 반환합니다.
TripleDES test = new TripleDES("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
이 함수는 바이트 배열을 받아 생성자에서 제공된 키 자료를 사용하여 암호화하거나 복호화합니다. 완료되면 바이트 배열을 반환합니다.
RC4 test = new RC4("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
이 함수는 바이트 배열을 받아 생성자에서 제공된 키 자료를 사용하여 암호화하거나 복호화합니다. 완료되면 바이트 배열을 반환합니다.
RC2 test = new RC2("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
이 함수는 바이트 배열을 받아 생성자에서 제공된 키 자료를 사용하여 암호화하거나 복호화합니다. 완료되면 바이트 배열을 반환합니다.
MultiXOR test = new MultiXOR("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
이 함수는 바이트 배열을 받아 생성자에서 제공된 키 자료를 사용하여 암호화하거나 복호화합니다. 완료되면 바이트 배열을 반환합니다.
XTEA test = new XTEA("Lovecraft");
Byte[] bEncrypted = test.Encrypt(bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
여기서 주의할 점은 v2.0.0에서는 ECDH가 NuGet에서 사용 가능한 모든 .Net 버전에서 지원된다는 것입니다. 그러나 .Net의 다소 의문스러운 설계 결정 때문에 지원되는 모든 대상 간의 상호 운용을 구현하는 것은 간단하지 않습니다.
그 결과 Framework < .Net 4.7과 그 외 모든 대상 간에는 구현 차이가 있습니다. 키 교환을 성공적으로 수행하려면 두 클라이언트가 동일한 그룹에 속해야 합니다. 예를 들어 한 클라이언트는 .Net 6에, 다른 클라이언트는 .Net 4.5.1에 있어야 한다면 RSA를 대신 사용해야 합니다.
.Net 버전 관리에 대해 자세히 알아보려면 다음 리소스를 참조하세요.
Framework < .Net 4.7
이 대상들은 nistP256만 지원하며 라이브러리를 다음과 같이 사용할 수 있습니다.
// Initialize both clients
ECDH test1 = new ECDH();
ECDH test2 = new ECDH();
// Exchange public keys
Byte[] bPublic1 = test1.GetPublicKeyArray();
Byte[] bPublic2 = test2.GetPublicKeyArray();
// Derive
test1.DeriveSharedKey(bPublic2);
test2.DeriveSharedKey(bPublic1);
// Encrypt / Decrypt
Byte[] bEncrypted1 = test1.Encrypt(bTestData);
Byte[] bDecrypted2 = test2.Decrypt(bEncrypted1);
.Net 4.7+ || Standard 2.1 || .Net 6
이 대상들은 생성자의 인자로 곡선을 사용합니다.
public enum ECCurveType
{
brainpoolP160r1,
brainpoolP160t1,
brainpoolP192r1,
brainpoolP192t1,
brainpoolP224r1,
brainpoolP224t1,
brainpoolP256r1,
brainpoolP256t1,
brainpoolP320r1,
brainpoolP320t1,
brainpoolP384r1,
brainpoolP384t1,
brainpoolP512r1,
brainpoolP512t1,
nistP256,
nistP384,
nistP521
}
사용법은 아래와 같습니다.
// Initialize both clients
ECDH test1 = new ECDH(ECDH.ECCurveType.nistP521);
ECDH test2 = new ECDH(ECDH.ECCurveType.nistP521);
// Exchange public keys
Byte[] bPublic1 = test1.GetPublicKeyArray();
Byte[] bPublic2 = test2.GetPublicKeyArray();
// Derive
test1.DeriveSharedKey(bPublic2);
test2.DeriveSharedKey(bPublic1);
// Encrypt / Decrypt
Byte[] bEncrypted1 = test1.Encrypt(bTestData);
Byte[] bDecrypted2 = test2.Decrypt(bEncrypted1);
이 기능은 ECDH의 경우처럼 공유 비밀을 도출하기 위해 공개 키를 교환할 필요가 없으므로 반드시 두 클라이언트가 필요한 것은 아닙니다. 물론 위와 같이 공개 키를 네트워크를 통해 다른 클라이언트에 보내면 그 클라이언트가 오직 당신만 복호화할 수 있는 데이터를 암호화할 수 있습니다.
RSA test = new RSA();
Byte[] bPublicKey = test.GetPublicKeyArray();
Byte[] bEncrypted = test.Encrypt(bPublicKey, bTestData);
Byte[] bDecrypted = test.Decrypt(bEncrypted);
암호화 및 복호화되는 데이터는 머신 범위로 제한됩니다. 데이터는 호스트 외부에서는 복호화할 수 없습니다.
// Without entropy
DPAPI test = new DPAPI();
Byte[] bEncrypted = test.EncryptUserDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptUserDPAPI(bEncrypted);
// With entropy
DPAPI test = new DPAPI("Lovecraft");
Byte[] bEncrypted = test.EncryptUserDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptUserDPAPI(bEncrypted);
암호화 및 복호화되는 데이터는 현재 사용자 범위로 제한됩니다. 다른 사용자 컨텍스트에서는 데이터를 복호화할 수 없습니다.
// Without entropy
DPAPI test = new DPAPI();
Byte[] bEncrypted = test.EncryptMachineDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptMachineDPAPI(bEncrypted);
// With entropy
DPAPI test = new DPAPI("Lovecraft");
Byte[] bEncrypted = test.EncryptMachineDPAPI(bTestData);
Byte[] bDecrypted = test.DecryptMachineDPAPI(bEncrypted);
시간 기반 일회용 비밀번호(TOTP)는 작업 수행 시 해당 작업이 진본인지 검증하기 위한 추가 확인 수단으로 사용될 수 있습니다. 라이브러리에서 생성된 TOTP는 전체 UtcNow 1분 동안 유효합니다. 이 숫자 비밀값은 대칭 암호화 알고리즘의 회전 키를 동적으로 시드하는 데에도 사용할 수 있습니다. 클라이언트가 서로 다른 머신에서 동일한 시드를 사용하면 동일한 TOTP를 받게 됩니다.
// Generate a TOTP using a string seed
TOTP test = new TOTP("Lovecraft");
Console.WriteLine("[+] TOPT Code : " + oOTP.Code);
Console.WriteLine("[+] TOPT Last Code: " + oOTP.LastCode);
Console.WriteLine("[+] TOPT Validity : " + oOTP.Seconds);
// Validate TOTP based on string seed
Boolean bValid = test.ValidateTOTP("Lovecraft", oTOTP.Code);
// Validate TOTP with forgiveness, this allows the previous TOTP
// to also be counted as valid
Boolean bValid = test.ValidateTOTP("Lovecraft", oTOTP.LastCode, true);