C#에서 RSA를 사용하여 파일 암호화 (거대한 데이터)를 사용하는 방법
-
20-09-2019 - |
문제
나는 암호화를 처음 사용합니다. 비대칭 암호화 알고리즘을 구현 해야하는데, 이는 개인/공개 키를 사용한다고 생각합니다. rsacryptoserviceprovider 샘플을 사용하기 시작했습니다. 암호화하는 것은 작은 데이터로 괜찮 았습니다. 그러나 비교적 더 큰 데이터 "2 줄"에서 사용할 때는 예외를 얻을 수 있습니다. cryptographicexception "나쁜 길이"!
//Create a new instance of RSACryptoServiceProvider.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
//Import the RSA Key information. This only needs
//toinclude the public key information.
//RSA.ImportParameters(RSAKeyInfo);
byte[] keyValue = Convert.FromBase64String(publicKey);
RSA.ImportCspBlob(keyValue);
//Encrypt the passed byte array and specify OAEP padding.
//OAEP padding is only available on Microsoft Windows XP or
//later.
encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}
그런 다음 cryptostream을 사용하여 대형 데이터 (또는 파일) 암호화 샘플을 찾았으며 DES 또는 3DES와 같은 대칭 알고리즘 만 사용하여 CreateEncryptor가 Cryptostream의 생성자에 대한 입력자 중 하나로 ICRYPTOTRANSFORM을 반환 할 수 있습니다 !!!
CryptoStream cStream = new CryptoStream(fStream,
new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
RSA를 사용하여 파일을 암호화하는 방법은 무엇입니까?
해결책
다른 답변에서 언급했듯이 비대칭 암호화는 키 크기보다 작은 데이터를 암호화하도록 설계되었습니다.
두 시스템간에 많은 양의 암호화 된 데이터를 전송해야 할 때 구현 한 한 가지 옵션은 공개 키가 발신자와 수신기 모두에게 알려진 RSA 키어에있는 것입니다. 그러면 데이터를 보내야 할 때 수신기가 새 RSA 키프 에이어를 생성하는 것입니다. , 공통 공개 키로 해당 키패 아르의 공개 키를 암호화하고 암호화 된 공개 키를 발신자에게 보냅니다. 발신자는 개인 키를 사용하여 수신기 공개 키를 해독합니다 (수신자가 수신자가 수신기를 생성 할 필요가없는 것처럼 수신자가 알 필요가없는 것), 대칭 암호화 키를 생성하고, 대칭 키로 데이터를 암호화합니다. 그런 다음 수신기에서받은 공개 키를 사용하여 대칭 키를 암호화합니다. 암호화 된 대칭 키와 암호화 된 데이터는 수신기로 전송되어 생성 된 개인 키를 사용하여 대칭 키를 해독 한 다음 데이터를 해독합니다.
당신은 사용할 수 있습니다 RSACryptoServiceProvider.ToXMLString()
그리고 RSACryptoServiceProvider.FromXMLString()
수신기 응용 프로그램에서 공통 공개 키를 XML 문자열 리터럴로 저장하는 방법.
대칭 암호화 키를 생성 할 때 잊지 마십시오. RNGCryptoServiceProvider()
키를 생성하는 것은 훨씬 더 안전한 생성 방법 (Pseudo) 랜덤 숫자입니다.
또한 3DES를 대칭 암호화 알고리즘으로 사용하는 것을 강력히 권장합니다. 오래되었고 나이를 보여주기 시작합니다. 어느 쪽이든 AES 대칭 암호화를 사용하십시오 AesCryptoServiceProvicer
또는 RijndaelManaged
클래스.
다른 팁
RSA는 키 길이보다 짧은 데이터 블록 만 암호화 할 수 있으므로 일반적으로하는 일은 다음과 같습니다.
- AES (또는 이와 유사한)에 필요한 올바른 길이의 임의 키를 생성합니다.
- 해당 키를 사용하여 AES 또는 이와 유사한 데이터를 암호화합니다.
- RSA 키를 사용하여 랜덤 키를 암호화합니다
그런 다음 2와 3의 출력을 모두 게시합니다.
해독하기 위해
- RSA 키를 사용하여 AES 키를 해독하십시오.
- 해당 AES 키를 사용하여 데이터를 해독합니다
일반적으로 RSA는 대칭 키 (예 : 스트림 시작시) 만 전송하는 데 사용되며 벌크 데이터는 해당 키로 암호화됩니다.
비대칭 암호화는 많은 데이터를 전송하기에 충분히 효율적이지 않습니다.
RSA 나쁜 길이 예외에 관한 향후 검색 ...
다음과 같이 특정 키 크기로 암호화 할 수있는 최대 바이트 수를 계산할 수 있습니다.
((키즈 -384) / 8) + 37
그러나 최적의 비대칭 암호화 패딩 (OAEP) 매개 변수가 참이면 다음을 최대 바이트를 계산하는 데 사용할 수 있습니다.
((키즈 -384) / 8) + 7
법적 키 크기는 16384 년까지 384이며 스킵 크기는 8입니다.
RSA의 .NET 구현 (및 모든 공개/개인 키 알고리즘)은 대규모 데이터 블록을 지원하지 않습니다. 이것이 공개/개인 키의 목표가 아니기 때문입니다.
대신 당신이 할 일은 새로운 대칭 키를 생성하고이를 사용하여 데이터를 암호화하는 것입니다. 그런 다음 공개/개인 키를 사용하여 대칭 키를 암호화하고 상대방과 안전하게 교환합니다. 그런 다음 대칭 키를 해독하여 데이터를 암호화하지 않도록합니다.
우리는 다음과 같습니다.
MaxBlockSize=((KeySize - 384) / 8) + 37
또는
MaxBlockSize=((KeySize - 384) / 8) + 7
따라서 데이터를 일부 블록으로 나눈 다음 각 블록을 암호화 한 다음 병합 할 수 있습니다.