문제

나는 암호화를 처음 사용합니다. 비대칭 암호화 알고리즘을 구현 해야하는데, 이는 개인/공개 키를 사용한다고 생각합니다. 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는 키 길이보다 짧은 데이터 블록 만 암호화 할 수 있으므로 일반적으로하는 일은 다음과 같습니다.

  1. AES (또는 이와 유사한)에 필요한 올바른 길이의 임의 키를 생성합니다.
  2. 해당 키를 사용하여 AES 또는 이와 유사한 데이터를 암호화합니다.
  3. RSA 키를 사용하여 랜덤 키를 암호화합니다

그런 다음 2와 3의 출력을 모두 게시합니다.

해독하기 위해

  1. RSA 키를 사용하여 AES 키를 해독하십시오.
  2. 해당 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

따라서 데이터를 일부 블록으로 나눈 다음 각 블록을 암호화 한 다음 병합 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top