2012-06-19 25 views
19

Tôi đã có một ứng dụng bằng cách sử dụng Bouncy Castle để giải mã PGP đã chạy mà không gặp bất kỳ sự cố nào trong 8 tháng qua hoặc hơn, và 2 ngày qua tất cả sự cố đột ngột xảy ra Phương thức GetDataStream đang ném một ngoại lệ:Bouncy Castle PGP Decryption Issue

Thông báo ngoại lệ: "lỗi thiết lập mật mã bất đối xứng".

Thông báo ngoại lệ bên trong: "Không phải là khóa RSA".

private static PgpObjectFactory getClearDataStream(PgpPrivateKey privateKey, PgpPublicKeyEncryptedData publicKeyED) 
{ 
    // Exception throws here. 
    Stream clearStream = publicKeyED.GetDataStream(privateKey); 

    PgpObjectFactory clearFactory = new PgpObjectFactory(clearStream); 
    return clearFactory; 
} 

Mấu chốt chưa hết hạn, nó không có ngày hết hạn:

enter image description here

tôi đã không thực hiện bất kỳ thay đổi đối với ứng dụng, tôi đã không chạm vào phím, vì vậy tôi không thể hiểu tại sao một vấn đề đã xuất hiện từ màu xanh. Bất kỳ ý tưởng? Tôi cũng có thể giải mã các tập tin bằng cách sử dụng Kleopatra bằng cách sử dụng các phím tương tự mà tôi tải trong ứng dụng.

Cập nhật 1 - Tôi đã tải xuống bản dùng thử miễn phí cho OpenPGP Library for .NET, có vẻ cũng sử dụng BouncyCastle và tôi không gặp sự cố khi giải mã tệp bằng cùng một khóa. Vì một lý do nào đó, việc triển khai giải mã của tôi bằng BouncyCastle đã hoạt động trong vài tháng đã ngừng hoạt động vì một lý do nào đó mà tôi chưa thể xác định được.

Cập nhật 2 - Tôi đã kéo tệp từ tuần trước đã hoạt động và tôi cũng đã tải xuống mã nguồn của BouncyCastle để tôi có thể duyệt qua và gỡ lỗi. giữa một tệp hoạt động và một tệp không hoạt động. Trường hợp ngoại lệ được ném vào đầu của phương pháp GetDataStream của lớp PgpPublicKeyEncryptedData:

byte[] plain = fetchSymmetricKeyData(privKey); 

Khi tôi bước vào phương pháp này, cho các tập tin mà tôi có thể giải mã mà không cần bất kỳ vấn đề, tôi đã nhận thấy rằng keyData.Algorithm biến được đặt thành "ElGamalEncrypt", trong khi đối với các tệp mà ngoại lệ ném, tệp khóaData.Algortithm được đặt thành "RsaGeneral". Tại sao chúng lại khác nhau? Công ty có gửi cho tôi các tệp thay đổi phương thức mã hóa của họ không? Và phương pháp mã hóa này có được BouncyCastle hỗ trợ không?

private byte[] fetchSymmetricKeyData(PgpPrivateKey privKey) 
{ 
    IBufferedCipher c1 = GetKeyCipher(keyData.Algorithm); 

    try 
    { 
     c1.Init(false, privKey.Key); 
    } 
    catch (InvalidKeyException e) 
    { 
     throw new PgpException("error setting asymmetric cipher", e); 
    } 

Ngoài ra, không chắc chắn nếu điều này có liên quan, loại chứng chỉ của khóa của chúng tôi là DSA.

enter image description here

Cập nhật 3 - Tôi đã không thể tìm ra cách để giải quyết vấn đề như được nêu ra cho các phím hiện hành. Tôi đã tạo các khóa mới (loại DSA) ngày hôm qua và với các khóa mới, vấn đề đã được giải quyết.

Cập nhật 4 - Sự cố này vừa xuất hiện trở lại, với khóa mới đã hoạt động trong lần cập nhật cuối cùng của tôi. Một lần nữa, keyData.Algorithm trong lớp PgpPublicKeyEncryptedData đang được xem là "RsaGeneral" thay vì "ElGamalEncrypt" bây giờ. Tại sao thuộc tính Thuật toán thay đổi? Người đó mã hóa tập tin có thay đổi gì không?

+3

Bitrot. xxxxxxx – Joshua

+2

Có thể chứng chỉ giữ khóa RSA đã hết hạn? Bạm có thể kiểm tra cái này không? – Oleksi

+0

Tôi đã kiểm tra trước đó và chỉ cần thêm ảnh chụp màn hình, khóa của chúng tôi không có ngày hết hạn. Ngoài ra, tôi có thể giải mã thủ công các tệp bằng tiện ích như Kleopatra sử dụng cùng một khóa. Vì vậy, các phím là tốt. – mservidio

Trả lời

1

Đây có thể là quan trọng (Nguồn: http://www.opensourcejavaphp.net/csharp/itextsharp/PgpPublicKeyEncryptedData.cs.html):

Nó giải thích giá trị của keyData.Algorithm của bạn là khác nhau, nhưng tại sao tôi vẫn không chắc chắn về.Nó rất có thể là tập tin đầu vào đó là trường hợp. Nó có thể khác (khách hàng sử dụng khóa khác?)

private static IBufferedCipher GetKeyCipher(
      PublicKeyAlgorithmTag algorithm) 
     { 
      try 
      { 
       switch (algorithm) 
       { 
        case PublicKeyAlgorithmTag.RsaEncrypt: 
        case PublicKeyAlgorithmTag.RsaGeneral: 
         return CipherUtilities.GetCipher("RSA//PKCS1Padding"); 
        case PublicKeyAlgorithmTag.ElGamalEncrypt: 
        case PublicKeyAlgorithmTag.ElGamalGeneral: 
         return CipherUtilities.GetCipher("ElGamal/ECB/PKCS1Padding"); 
        default: 
         throw new PgpException("unknown asymmetric algorithm: " + algorithm); 
       } 
      } 
      catch (PgpException e) 
      { 
       throw e; 
      } 
      catch (Exception e) 
      { 
       throw new PgpException("Exception creating cipher", e); 
      } 
     } 
0

Có vẻ như một bên khác đang mã hóa các khóa khác/khác. Có lẽ khóa của bạn cũng chứa khóa RSA, nhưng BouncyCastle chỉ sử dụng khóa đầu tiên (???). Sử dụng gpg, bạn có thể kiểm tra nội dung của tệp được mã hóa bằng cách phát hành gpg --list-packages YourEncryptedFile.pgp

Sau đó áp dụng cùng một lệnh cho tệp 'tốt', và dây móc khóa của bạn và so sánh các số nhận dạng chính tệp được mã hóa. Vì bạn đang sử dụng khóa DSA, tệp phải được mã hóa thành khóa con ElGamal.