当前位置:编程学习 > C#/ASP.NET >>

.NET的那种RSA加解密算法能与JAVA的RSA加解密的保持一致?

.NET的RSA加密

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;

        /// <summary>
        /// RSA 私钥加密
        /// </summary>
        /// <param name="data">数据</param>
        /// <param name="key">私钥</param>
        /// <returns></returns>
        public byte[] RSAEncryptByPrivate(byte[] data, byte[] key)
        {
            try
            {
                //java: PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
                //java: KeyFactory keyFactory = KeyFactory.getInstance("RSA");
                //java: PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
                AsymmetricKeyParameter Privatekey = PrivateKeyFactory.CreateKey(key);

                //java: Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
                IBufferedCipher c = CipherUtilities.GetCipher("RSA");

                //java: cipher.init(Cipher.ENCRYPT_MODE, privateKey);
                c.Init(true, Privatekey);

                //java: return cipher.doFinal(data);
                return c.DoFinal(data);
            }
            catch
            {
                return null;
            }
        }


JAVA的算法

    public static byte[] encryptByPrivateKey(byte data[], byte key[])
        throws Exception
    {
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        java.security.PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(1, privateKey);
        return cipher.doFinal(data);
    }


这两个RSA加密的方法加密的结果就是不一样.晕死.
参数data的Bse64:
vFI598yiPhn7qhXpJI97aw==
参数key的Base64:
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKAAnRDlrJiwi34p
b3neOugwuDcruadpkvW84fJY1rS3U1DM69JoAM+v1UwcMIXSBvtGhUNjZHswFP3P
YXtB5I61fV2zOi7UZ09FS38JVaTt65Ju/uxGqu+oYleiRuR/ehn89mChxo8WUMi3
9NOvkxPdjLKWCMcEpffpR6RFTOqzAgMBAAECgYB2eB3T3gsOv2F5l5qHxKkfNLuh
dgmv0HbU5vbxZyAKjNbus9xEXWeEX6/x+8ldvGYY9V1EyTokEDTqvPtztRVR/Y6G
ptBzycEckuu6oCJoecNMfzvmIueDNf4uI8VYyvntPedQZ6oICXHkrCNeuJ+jZQGm
L8oFeDJmaPdVZUdu2QJBAMu5eEAPC2RVvvSvhAj48sOsRDAH6bMOjxkkT3YIqMBe
O8tcUnPTJlIX7Vr1gGH6Ubgw3gNnbKvGAkVF46UASUcCQQDJDxFR+p2CbwEEnLtk
02T58zgYln2Nd3J5ERfpCMW+qXLrgxgecCtAB+4YzI8KA5RKweb6Jcp+0V/ea4Qy
I8k1AkBpWs0ZM66MgNtz5qC9kyDYmGna/PyaoNjYA7MkM24xrYn2rRPm2jdjFQSm
mXd/M9i3DG6EDCRi4M+jy3Tii7dZAkB8J07FtaEPyyXwyCu7bgI7imIIZN1wvuK0
OcbvApjBTHeHULNTEGbUqlDvhVmKkH1A0I2lyDJLr1SozvGZ2JlFAkAW/BUT9c+E
4RNL5W3yY1oOVpI1bQs/QCiDlZ69xVLUl56D6IOSlr09cpQH6c/hIALTq3P3JFGz
7o5JACVSuryX

.NET加密的结果Base64:
jlSBfsHvjdQ84ufHPMdDUhK6u+jVuLYmLtK5smBk28r+cZ/UQR3elP/GyJidOr8+
PF+Dbg88aHhfX9EqlL2JrQvA3DwjgYZnabKz/wLnWSJfVu5jGsNe/+TLX+QIy3ZW
ubLs8Pm/1uGFjFRWXp7rEV4ikOXwWY4AX0uNdtUdLRk=
JAVA加密的结果Base64:
Gx2KtW8fB7ctK6n3f4Q3VgB+7pZRyY2alpJpIIQTanlvh1dnUXBa6KBNyuq/X1s5
NmfWaIesA/WasL28H1qUoSgrvJK9rVzjvU6O5ayjvUlXrZ7aS6oZhrgHSK4lEqsh
tvv5RVzJwkQQxbqXR4JVfaPUSmWhzfvfb6dkpsccBNc=

为啥就是不一样呢?有什么法子能搞成一致的?.NET使用微软自带的加密更不成,那玩意儿每次结果都不同. --------------------编程问答-------------------- rsa每次加密结果都是不一样的 他们采用pkcs1填充方式 这没关系 只要加密后的密文能解密就可以了
具体可以看pkcs1的文档 rfc都有详细的说明 --------------------编程问答-------------------- 加密的结果是要提交给第三方JAVA服务端

如果是让C#服务端解密,也就不会有此问题了. --------------------编程问答--------------------  求解. --------------------编程问答-------------------- 史上最低价的云计算大会门票抢购火热进行中,每日限量5张,数量有限,先到先得噢! --------------------编程问答-------------------- 、.Net环境下面对同样一个字符串用相同的RSA公钥加密,居然每次的结果不一样!而Java环境下面则每次的结果是一样的;这点就是我们此次解决互通问题的关键!究其原因是这样的:.Net为了加强RSA加密算法的安全性,在每次加密的时候都会生成一定的随机数和原始数据一起被加密,这显然不是单纯标准的RSA加密;而Java中的RSA加密是完全标准化的,不添加随机数的 --------------------编程问答--------------------
引用 5 楼 godgirl 的回复:
.Net为了加强RSA加密算法的安全性,在每次加密的时候都会生成一定的随机数和原始数据一起被加密,这显然不是单纯标准的RSA加密;而Java中的RSA加密是完全标准化的,不添加随机数的


这是错误的结论。
RSA有多个补齐标准,比如PKCS#1和OAEP等,都支持随机扰动。
PKCS#1 v1.5有两种补齐不是随机(T=0和T=1),但不常用。

PKCS#1 v1.5见该帖8楼(http://bbs.csdn.net/topics/390447249)。
详细可阅读:http://en.易做图.org/wiki/RSA_(algorithm) --------------------编程问答-------------------- RSA有多个补齐标准,比如PKCS#1,这个可以与java兼容,OAEP不行。 --------------------编程问答-------------------- java也可以选填充方式的,设置这个PKCS#1就能保持和.net 一致了,虽然每次加密结果都不同,但可以互相识别。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,