我在嘗試一個雙贏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();
這可能是值得而不是問在這裏:http://crypto.stackexchange.com/ – 2013-03-26 10:29:24