2013-03-17 33 views
4

我在嘗試一個雙贏8 Metro應用和REST風格的WCF服務之間傳遞一些加密的數據。最初,Metro應用請求公鑰和WCF服務返回它作爲原料流,以避免任何麻煩的格式問題。 Base 64編碼的公鑰在metro應用程序中解碼爲字節數組。這是問題發生的地方。當我試圖調用AsymmetricKeyAlgorithmProvider.ImportPublicKey我得到的錯誤「ASN1壞標記值滿足」。Windows 8的地鐵RSA加密:AsymmetricKeyAlgorithmProvider ImportPublicKey失敗

我使用RSA PKCS1的加密。下面是相關代碼:

WCF服務

 string keyName = "This is passed in via a parameter"; 
    var key = !CngKey.Exists(keyName) ? CngKey.Create(CngAlgorithm2.Rsa, keyName) : CngKey.Open(keyName); 

    // Create the RSA container to get keys and then dispose 
    using (var rsaCng = new RSACng(key) { EncryptionPaddingMode = AsymmetricPaddingMode.Pkcs1, KeySize = 2048 }) 
    { 
     byte[] publicBlob = rsaCng.Key.Export(CngKeyBlobFormat.GenericPublicBlob); 
     publicKey = Convert.ToBase64String(publicBlob); 
    } 

Metro應用

public static string Encrypt(IBuffer dataBuffer, string publicKeyString) 
    { 
    var asymmAlg = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 
    // The next line fails with ASN1 bad tag value met 
    var publicKey = asymmAlg.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(publicKeyString), CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey); 

    var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null); 
    return CryptographicBuffer.EncodeToBase64String(encryptedData); 
    } 

編輯1:下面

更多信息導出從公鑰來自WCF的2048bit密鑰對服務會產生283位長度的密鑰blob,而從Metro應用程序導出相同類型的公鑰只有270位。當我導入Metro生成的公鑰時,它會成功。任何想法爲什麼WCF服務的公鑰上有13位額外的位?我認爲那些額外的13位導致失敗。

這裏是地鐵代碼,產生了更短的公共密鑰團:

var provider = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 
CryptographicKey standardKeyPair = provider.CreateKeyPair(2048); 
byte[] standardKey = standardKeyPair.ExportPublicKey(CryptographicPublicKeyBlobType.Pkcs1RsaPublicKey).ToArray(); 
+0

這可能是值得而不是問在這裏:http://crypto.stackexchange.com/ – 2013-03-26 10:29:24

回答

1

比較晚,但也許它會幫助你或保存別人的時間...... BLOB類型的

更改類型進口期間。這真的很奇怪,但我在試驗後取得了成功。

你在WCF的代碼可能會保持原樣。

變化只是地鐵代碼:

public static string Encrypt(IBuffer dataBuffer, string publicKeyString) 
{ 
    var asymmAlg = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.RsaPkcs1); 
    // The next line fails with ASN1 bad tag value met 
    var publicKey = asymmAlg.ImportPublicKey(CryptographicBuffer.DecodeFromBase64String(publicKeyString), CryptographicPublicKeyBlobType.BCryptPublicKey); 

    var encryptedData = CryptographicEngine.Encrypt(publicKey, dataBuffer, null); 
    return CryptographicBuffer.EncodeToBase64String(encryptedData); 
} 

所以在這裏唯一的變化是在進口過程中BCryptPublicKey。然後它工作。但不要問我爲什麼:-)。