Pointycastle는 BouncyCastle 자바 라이브러리에서 영감을 받은 암호 알고리즘 및 기본 요소의 포괄적인 구현을 제공하는 Dart 라이브러리입니다. 다양한 암호화, 해싱, 서명 및 키 관리 작업을 지원하여 크로스플랫폼 애플리케이션에서 안전한 데이터 처리에 적합합니다. Flutter 또는 기타 Dart 환경에서 강력하고 잘 테스트된 암호 기능이 필요한 개발자를 위해 설계되었습니다.
사용 사례
안전한 데이터 저장
인증 프로토콜
디지털 서명
암호화된 통신
토큰 생성
키 파생
주요 기능
광범위한 알고리즘 지원
크로스 플랫폼 호환성
잘 문서화된 API
강력한 보안 기반
모듈러 디자인
활성 유지보수
적합한 대상
보안 앱을 개발하는 개발자
암호화가 필요한 응용 프로그램
민감한 데이터를 처리하는 시스템
암호화가 필요한 백엔드 서비스
암호화에 관한 교육 프로젝트
고려 사항
암호화 개념에 대한 이해가 필요합니다
복잡한 작업에 따라 성능이 달라질 수 있습니다
최적화되지 않은 고처리량 시스템에는 권장하지 않습니다
API는 낮은 수준이고 반복적인 경우가 있습니다
원본 README
연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
Pointy Castle
A Dart library for encryption and decryption. In this release, most of the classes are ports of Bouncy Castle from Java
to Dart. The porting is almost always direct except for some classes that had been added to ease the use of low level
data.
To make sure nothing fails, tests and benchmarks for every algorithm are
provided. The expected results are taken from the Bouncy Castle Java version
and also from standards, and matched against the results got from Pointy Castle.
This library was adopted from the original project at https://github.com/PointyCastle/pointycastle at the request of the
authors to help support ongoing development. A list of major contributors is provided at contributors.md
This library is now ported to non-nullable-by-default, a breaking language feature released by the Dart team! See
https://dart.dev/null-safety and https://dart.dev/null-safety/migration-guide for more details. Please note that both
null-safe and non-null-safe versions are available (v3.x.x-nullsafety for null-safe, v2.x.x for non-null-safe). However,
only the null-safe version of this library is actively maintained.
Algorithms
Pointycastle implements a large set of algorithms. They must be instantiated and then initialized with
their parameters. Different algorithms have different parameter classes, which represent the
arguments to that algorithm. The relevant parameter type is provided for all the algorithms. To initialize an algorithm,
call the init method:
var algorithmVar = /* instantiate algorithm using registry here */ ;
var parameter = /* instantiate relevant parameter class here */ ;
algorithmVar.init(parameter);
Some algorithms will ask for more than just a parameter object in the initialization step. Once you have identified the
classes you intend to use in your project, it is recommended that you view the API docs at
https://pub.dev/documentation/pointycastle/latest/ to find the specifics of the methods from the
class you want to use.
In this release, the following algorithms are implemented:
(Most of the below are keywords for algorithms which can be used directly with the registry. The registry is an easy way
to instantiate classes in PointyCastle. See "Using the Registry" for more).
AEAD ciphers: To use with the registry, instantiate like this AEADCipher('ChaCha20-Poly1305'). Ciphers use AEADParameters to initialize.
'ChaCha20-Poly1305'
'AES/EAX'
Block ciphers: To use with the registry, instantiate like this PaddedBlockCipher('AES/SomeBlockModeHere/SomePaddingHere')
or like this StreamCipher('AES/SomeStreamModeHere'). See sections below for modes and paddings.
'AES'
Note that block ciphers can be used in stream cipher modes of operation
Block modes of operation: Most modes use ParametersWithIV to initialize. ECB uses KeyParameter and GCM uses AEADParameters.
'CBC' (Cipher Block Chaining mode)
'ECB' (Electronic Code Book mode)
'CFB-64' (Cipher Feedback mode, using blocks)
'GCTR' (GOST 28147 OFB counter mode, using blocks)
'OFB-64' (Output FeedBack mode, using blocks)
'CTR'/'SIC' (Counter mode, using blocks)
'IGE' (Infinite Garble Extension)
Authenticated block modes of operation
'GCM' (Galois-Counter mode)
'CCM' (counter with CBC-MAC)
Stream modes of operation: All modes use ParametersWithIV to initialize.
'CTR'/'SIC' (Counter mode, as a traditional stream)
Paddings:
'PKCS7'
'ISO7816-4'
Asymmetric block ciphers: Instantiate using the registry like this AsymmetricBlockCipher('RSA/SomeEncodingHere'). Initialization requires a RSAPrivateKey or RSAPublicKey.
'RSA'
Asymmetric block cipher encodings:
'PKCS1'
'OAEP'
Stream ciphers: Instantiation using registry is like this StreamCipher('ChaCha20/20'). Initialization requires a ParametersWithIV.
'Salsa20'
'ChaCha20/(# of rounds)' (original implementation)
'ChaCha7539/(# of rounds)' (RFC-7539 implementation)
If you don't know how many ChaCha rounds to use, use 20.
Digests: Instantiate using registry like this Digest('Keccak/384'). No initialization is necessary.
'Blake2b'
'MD2'
'MD4'
'MD5'
'RIPEMD-128|160|256|320'
'SHA-1'
'SHA-224|256|384|512'
'SHA-512/t' (t=8 to 376 and 392 to 504 in multiples of 8)
'Keccak/224|256|384|512'
'SHA3-224|256|384|512'
'Tiger'
'Whirlpool'
'SM3'
MACs: Instantiate using registry like this Mac('SomeBlockCipher/CMAC') or Mac('SomeDigest/HMAC) or Mac(SomeBlockCipher/Poly1305). CMAC and HMAC require a KeyParameter and Poly1305 requires a ParametersWithIV.
'HMAC'
'CMAC'
'Poly1305'
Signatures: Instantiate using registry like this Signer('SomeDigestHere/(DET-)ECDSA') or Signer('SomeDigestHere/RSA')
'(DET-)ECDSA'
'RSA'
Password based key derivators: Instantiation using registry like this KeyDerivator('SomeDigestHere/HMAC/PBKDF2')
or KeyDerivator('scrypt/argon2'). To initialize, you'll need a Pbkdf2Parameters, ScryptParameters, or
Argon2Parameters.
'PBKDF2'
'scrypt'
'argon2'
HMAC based key derivators: Instantiate using registry like this KeyDerivator('SomeDigestHere/HKDF'). To initialize, use an HkdfParameters.
'HKDF'
Asymmetric key generators Instantiate using registry like this KeyDerivator('RSA'). To initialize, use ECKeyGeneratorParameters or RSAKeyGeneratorParameters.
'ECDSA'
'RSA'
Secure PRNGs:
Based on block cipher in CTR mode
Based on block cipher in CTR mode with auto reseed (for forward security)
Based on Fortuna algorithm
Instantiating implementation objects
There are two ways to instantiate objects that implement the
algorithms:
using the registry, or
without the registry.
Using the registry
Using the registry, the algorithm name is provided to high-level class
factories.
This is especially convenient when an algorithm involves multiple
algorithm implementation classes to implement. All the necessary
classes can all be instantiated with a single name
(e.g. "SHA-256/HMAC" or "SHA-1/HMAC/PBKDF2" or "AES/CBC/PKCS7"), and they are
automatically combined together with the correct values.
For example,
final sha256 = Digest("SHA-256");
final sha1 = Digest("SHA-1");
final md5 = Digest("MD5");
final hmacSha256 = Mac("SHA-256/HMAC");
final hmacSha1 = Mac("SHA-1/HMAC");
final hmacMd5 = Mac("MD5/HMAC");
final derivator = KeyDerivator("SHA-1/HMAC/PBKDF2");
final signer = Signer("SHA-256/RSA");
Without the registry
Without the registry, each implementation class must be instantiated
using its constructor.
If an algorithm involves multiple algorithm implementation classes,
they each have to be individually instantiated and combined together
with the correct values.
For example,
final sha256 = SHA256Digest();
final sha1 = SHA1Digest();
final md5 = MD5Digest();
final hmacSha256 = HMac(SHA256Digest(), 64);
final hmacSha512 = HMac(SHA512Digest(), 128);
final hmacMd5 = HMac(MD5Digest(), 64);
final derivator = PBKDF2KeyDerivator(HMac(SHA256Digest(), 64));
final signer = RSASigner(SHA256Digest(), '0609608648016503040201');
Registry vs without registry
Using the registry means that all algorithms will be imported by
default, which can increase the compiled size of your program.
To avoid this, instantiate all classes directly by using the
constructors. But which classes can be instantiated with its
constructor will depend on which libraries have been imported.
Importing libraries
A program can take one of these three approaches for importing Point
Castle libraries:
only import pointycastle.dart;
only import exports.dart; or
import api.dart and individual libraries as needed.
Only import pointycastle.dart
The "pointycastle.dart" file exports:
the high-level API; and
implementations of the interfaces.
But it does not export any of the algorithm implementation classes.
import"package:pointycastle/pointycastle.dart";
With this import, none of the implementation classes can be
instantiated directly. The program can only use the registry.
For example,
final sha256 = Digest("SHA-256");
// final md5 = MD5Digest(); // not availablefinal p = Padding("PKCS7");
// final s = FortunaRandom(); // not available
Only import exports.dart
The "export.dart" file exports:
the high-level API,
implementations of the interfaces; and
every algorithm implementation class.
That is, everything!
import"package:pointycastle/export.dart";
With this import, all of the implementation classes can be
instantiated directly. The program can also use the registry.
For example, this works without any additional imports:
final sha256 = Digest("SHA-256");
final md5 = MD5Digest();
final p = Padding("PKCS7");
final s = FortunaRandom();
Import api.dart and individual libraries
The "api.dart" exports only:
the high-level API.
It does not include the implementations of the interfaces, nor any
algorithm implementation class.
import"package:pointycastle/api.dart";
// additional imports will be needed
With this import, only some of the implementation classes can be
instantiated directly (i.e. those that are also explicitly imported).
The program can also use the registry.
For example, the following only works because of the additional imports:
// In addition to "package:pointycastle/api.dart":import"package:pointycastle/digests/sha256.dart";
import"package:pointycastle/digests/md5.dart"import'package:pointycastle/paddings/pkcs7.dart';
final sha256 = Digest("SHA-256");
final md5 = MD5Digest();
final p = Padding("PKCS7");
// final s = FortunaRandom(); // not available without 'package:pointycastle/random/fortuna_random.dart'
Tutorials
Some articles on how to use some of Pointy Castle's features can be
found under the tutorials directory in the sources.