
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 の場合のように共有秘密を導出するために公開鍵を交換する必要がないため、必ず 2 つのクライアントを必要とすることに注意してください。もちろん、上記のように公開鍵をネットワーク経由で別のクライアントに送信すれば、そのクライアントはあなただけが復号化できるデータを暗号化できます。
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);