Android数据加密,适配.net RSACryptoServiceProvider Encrypt方法

Bense1999 2017-09-27 04:21:03
C#代码加密方法如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
public static class Helper
{
public static byte[] EncryptData(byte[] data, string certificateFilePath)
{
X509Certificate2 cert = new X509Certificate2(certificateFilePath);
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
//转码
//获取公钥,公钥加密,私钥解密, 数据库就是通过私钥解密,所以这里需要获取公钥进行加密,
string keyPublic = cert.PublicKey.Key.ToXmlString(false);
provider.FromXmlString(keyPublic);
//加密方法
byte[] by = provider.Encrypt(data, false);
//反转一维 Array 或部分 Array 中元素的顺序,这个无论加密解密必须得有否则失败
Array.Reverse(by);

return by;
}

public static string ByteToHexStr(byte[] bytes)
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
}
}


MSSQL加密解密代码:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '****'
go

--DROP MASTER KEY

create certificate HKGT0501T
from file = 'D:\Projects\MFM\HKGT0501T.cer'
with private key
(file = 'D:\Projects\MFM\HKGT0501T.pvk',decryption by password ='***')
go
--卡号加密
CREATE PROCEDURE [dbo].[up_EncryptCardNumber]
@CardNo VARCHAR(MAX)
AS
BEGIN

DECLARE @EncryptedValue VARCHAR(MAX)
SELECT @EncryptedValue= CONVERT(VARCHAR(MAX),EncryptByCert(Cert_ID('HKGT0501T'), @CardNo),2)

SELECT @EncryptedValue AS EncryptedValue
END
go

--卡号解密
CREATE PROCEDURE [dbo].[up_DecryptData]
@DataIn VARBINARY(128),
@DataOut VARBINARY(128)=NULL OUT
AS
BEGIN
SET @DataOut=DECRYPTBYCERT(Cert_ID('HKGT0501T'),@DataIn)
END
go


有哪位大神知道该加密算法对应的Android代码?
本人试过以下加密算法,但用MSSQL解密失败

public static String generateTCSRSAPassword(String certificateFilePath, String password) {
PublicKey tcsPublicKey = null;
try {
tcsPublicKey = getPublicKeyFromX509(certificateFilePath);
if (tcsPublicKey != null) {
Cipher tcsCipher = Cipher.getInstance(tcsPublicKey
.getAlgorithm());
tcsCipher.init(Cipher.ENCRYPT_MODE, tcsPublicKey, new SecureRandom());
String tcsEncryptPassword = bytesToHexString(tcsCipher
.doFinal(android.util.Base64.encode(password.getBytes(), android.util.Base64.DEFAULT)));
return tcsEncryptPassword;
} else {
//log.warn(ENCRPTY_FILE_NAME + " cannot be found!");
//throw new Exception(ENCRPTY_FILE_NAME + " cannot be found!");
}
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}

private static PublicKey getPublicKeyFromX509(String certificateFilePath)
throws Exception {
File file=new File(certificateFilePath);
InputStream fin = new FileInputStream(file);
CertificateFactory f = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) f
.generateCertificate(fin);
PublicKey pk = certificate.getPublicKey();
return pk;
}
...全文
74 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧