如何在C#中实现Adyen银行卡数据加密?求推荐相关类库
Adyen银行卡信息加密的C#实现方案
一、现成的C#类库:Adyen官方SDK
Adyen官方提供了正式的C# SDK,内置卡片加密功能,直接通过NuGet安装Adyen包即可使用,无需手动处理加密细节:
using Adyen; using Adyen.Model.Encrypt; var client = new Client(); var encryptService = new EncryptService(client); var card = new Card { Number = "4111111111111111", ExpiryMonth = "12", ExpiryYear = "2030", Cvc = "123" }; // 传入你的Adyen公钥,SDK会自动生成符合格式的加密字符串 var encryptionResult = encryptService.Encrypt(card, "your_adyen_public_key"); string encryptedCardData = encryptionResult.EncryptedCard;
二、自行实现Adyen卡片加密(不依赖官方SDK)
核心错误纠正
你之前用SHA256+Base64的思路完全错误:Adyen卡片加密用的是RSA非对称加密(可逆,Adyen用私钥解密),而SHA256是哈希算法(不可逆,仅用于校验),这也是你生成的字符串过短且无效的原因。
自行实现步骤
- 解析Adyen公钥
Adyen公钥格式类似pub_0123456789abcdef...,需要先转换为C# RSA对象可识别的格式:
using System.Security.Cryptography; using System.Text; public static RSACryptoServiceProvider LoadAdyenPublicKey(string adyenPublicKey) { // 移除前缀并转换为标准PEM格式 var keyContent = adyenPublicKey.Replace("pub_", ""); var pem = $"-----BEGIN PUBLIC KEY-----\n{Convert.ToBase64String(Convert.FromBase64String(keyContent), Base64FormattingOptions.InsertLineBreaks)}\n-----END PUBLIC KEY-----"; var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(RsaPemConverter.PemToXml(pem)); return rsa; } // 辅助方法:PEM转XML格式(C# RSA依赖XML配置) public static class RsaPemConverter { public static string PemToXml(string pem) { var cleanPem = pem.Replace("-----BEGIN PUBLIC KEY-----", "") .Replace("-----END PUBLIC KEY-----", "") .Replace("\n", ""); var keyBytes = Convert.FromBase64String(cleanPem); using var rsa = RSA.Create(); rsa.ImportSubjectPublicKeyInfo(keyBytes, out _); return rsa.ToXmlString(false); } }
- 构造标准卡片JSON
必须严格使用Adyen要求的小写字段名,字段包括number(卡号)、expiryMonth(两位月份)、expiryYear(四位年份)、cvc(安全码):
var cardData = new { number = "4111111111111111", expiryMonth = "12", expiryYear = "2030", cvc = "123" }; string jsonCardData = Newtonsoft.Json.JsonConvert.SerializeObject(cardData); byte[] cardDataBytes = Encoding.UTF8.GetBytes(jsonCardData);
- 执行RSA加密
必须使用OAEP填充模式+SHA256哈希,这是Adyen的强制要求:
var rsa = LoadAdyenPublicKey("your_adyen_public_key"); byte[] encryptedBytes = rsa.Encrypt(cardDataBytes, RSAEncryptionPadding.OaepSHA256); string encryptedBase64 = Convert.ToBase64String(encryptedBytes);
- 拼接Adyen格式前缀
格式为adyenjs_0_1_XX[加密内容],其中XX是公钥对应的版本号(比如公钥是pub_32_...则版本为32,需和Adyen提供的公钥版本一致):
string finalEncryptedData = $"adyenjs_0_1_32{encryptedBase64}";
关键注意事项
- 公钥版本号必须与Adyen提供的公钥匹配,否则加密结果无效。
- JSON字段名必须严格小写,不能自定义字段名。
- 必须使用OAEP填充+SHA256哈希,不能替换为其他加密参数。
内容的提问来源于stack exchange,提问作者itsReinsy
相关产品推荐
相关产品推荐

