关于RSA 加解密 java生成秘钥对 传给 C#进行加密,c#生成的密文怎么转换格式能在JAVA上用私钥解密

 java生成秘钥对  经过转换格式后传给 C#进行加密,C#生成的密文怎么转换格式能在JAVA上用私钥解密
tes是在C#生成的密文经过BASE64转码存到.txt文件,然后再JAVA中读出来


                 Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
BASE64Decoder decoder = new BASE64Decoder();
byte[] b1 = decoder.decodeBuffer(tes);
                 /** 执行解密操作 */
byte[] b = cipher.doFinal(b1);←这行代码解析出错,网上查原因是因为C#加密后得到的格式不正确

求大神解答

回答: 关于RSA 加解密 java生成秘钥对 传给 C#进行加密,c#生成的密文怎么转换格式能在JAVA上用私钥解密

  1. http://www.cnblogs.com/datous/p/RSAKeyConvert.html#

    格式转换要用到一个开源加密库Bouncy Castle Crypto APIs,官网地址: http://www.bouncycastle.org/csharp/


    /// <summary>
    /// RSA密钥格式转换
    /// </summary>
    public class RSAKeyConvert
    {
        /// <summary>
        /// RSA私钥格式转换,java->.net
        /// </summary>
        /// <param name="privateKey">java生成的RSA私钥</param>
        /// <returns></returns>
        public static string RSAPrivateKeyJava2DotNet(string privateKey)
        {
            RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
     
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
                Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
                Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
        }
     
        /// <summary>
        /// RSA私钥格式转换,.net->java
        /// </summary>
        /// <param name="privateKey">.net生成的私钥</param>
        /// <returns></returns>
        public static string RSAPrivateKeyDotNet2Java(string privateKey)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(privateKey);
            BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
            BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
            BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
            BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
            BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
            BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
            BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
            BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
     
            RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
     
            PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
            byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
            return Convert.ToBase64String(serializedPrivateBytes);
        }
     
        /// <summary>
        /// RSA公钥格式转换,java->.net
        /// </summary>
        /// <param name="publicKey">java生成的公钥</param>
        /// <returns></returns>
        public static string RSAPublicKeyJava2DotNet(string publicKey)
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
            return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
                Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
                Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
        }
     
        /// <summary>
        /// RSA公钥格式转换,.net->java
        /// </summary>
        /// <param name="publicKey">.net生成的公钥</param>
        /// <returns></returns>
        public static string RSAPublicKeyDotNet2Java(string publicKey)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(publicKey);
            BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
            BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
            RsaKeyParameters pub = new RsaKeyParameters(false, m, p);
     
            SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
            byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
            return Convert.ToBase64String(serializedPublicBytes);
        }
    }

iOS DES加密偏移量字符串和加密秘钥

  1. Q
    各位,我今天在做项目的时候遇到了这个问题。在我们的请求数据的文档中。我看到了我们使用的DES中又一个是偏移量字符串和加密秘钥。当时我就百度了一下DES的加密用法,我看了一会博客和代码后。我知道了文档中提供的那个加密秘钥是该放在DES加密代码中什么地方了。可是这个还有一个偏移量字符串我看了很久愣是没搞懂这个偏移量字符串值是干嘛用得,该如何加在代码中
  2. A
    这里求指教,

现在调用百度地图api需要秘钥吗?

  1. Q
    电脑上开发,我看有人说不需要秘钥了。。我想问下demo是从哪看的,是从这看的吗?http://developer.baidu.com/map/jsdemo.htm#i8_2
    这上面明显写着要秘钥啊。。。再就是申请秘钥的页面怎么一直在请求啊。。。请求不到?。
    谢谢解答。
  2. A
    1.5以前的不用。

PYTHON 语言 关于秘钥更新的问题

  1. Q
            B1,B2,B3,..........等节点定期(如每隔一个小时)向A节点发送秘钥更新申请,A定期检测是否有到了更新时间却没有发送申请的B节点,如果有便删除该B节点。

          请问如何实现“检测是否有到了更新时间却没有发送申请的B节点” ,(是不是说B两次申请的时间差超过了一小时,时间差怎么求?用ctime()函数获取时间却不能做减法)一点没思路,求指教  


    用python编写
  2. A

    from datetime import datetime, timedelta
    import time
    last_time = datetime.now()
    print 'last_time:', last_time
    time.sleep(2.0)
    time_now = datetime.now()
    print 'time_now:', time_now
    time_delta = time_now - last_time
    print time_delta
    print 'time_delta:', time_delta
    one_second = timedelta(seconds=1) # 还可以指定 minutes hours days 等参数
    if time_delta > one_second:
        print "time elapsed more then 1 sencod."
    else:
        print "time elapsed less then 1 sencod."


    last_time: 2015-03-10 22:08:02.838000
    time_now: 2015-03-10 22:08:04.839000
    0:00:02.001000
    time_delta: 0:00:02.001000
    time elapsed more then 1 sencod.

如何用java代理查询多个视图的文档,然后生成静态的html树状列表

  1. Q
    如题。视图分父类和子类。
  2. A
    分别查询多个视图,把数据获取后。丢页面处理
    树桩列表,在表单上JS写

Win32 DLL在VS中生成可被C#调用,相同代码采用nmake生成C#调用失败

  1. Q
    RT,VS项目中的参数设置

    C/C++:

    /Od  /I "$(OMROOT)\LangCpp" /I "$(OMROOT)\LangCpp\osconfig\WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "OMANIMATOR" /D "EHa" /D "_CRT_SECURE_NO_DEPRECATE" /D "WINVER=0x0501" /D "_ITERATOR_DEBUG_LEVEL=2" /D "_USRDLL" /D "DLLTEST2_EXPORTS" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yc"stdafx.h" /Fp"Debug\DllTest2.pch" /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W0 /nologo /c /ZI /TP /errorReport:prompt

    Link:

    /OUT:"C:\Users\wyh\Desktop\DllTest2\Debug\DllTest2.dll" /INCREMENTAL /NOLOGO /DLL /MANIFEST /MANIFESTFILE:"Debug\DllTest2.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"c:\Users\wyh\Desktop\DllTest2\Debug\DllTest2.pdb" /SUBSYSTEM:WINDOWS /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT "GUILib.lib" "$(OMROOT)\LangCpp\lib\MSVC9oxfinst.lib" "$(OMROOT)\LangCpp\lib\MSVC9omComAppl.lib" "$(OMROOT)\LangCpp\lib\MSVC9aomanim.lib" "winmm.lib" "wsock32.lib"  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

    生成的DLL可被C#调用。 namke的Makefile文件参数设置:

    CPP_PROJ=/nologo /Od $(OM_INC) \
    /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "OMANIMATOR" \
             /D "EHa" /D "_CRT_SECURE_NO_DEPRECATE" /D "WINVER=0x0501"  \
             /D "_ITERATOR_DEBUG_LEVEL=2" /D "_USRDLL" /D "DLLTEST2_EXPORTS" /D "_WINDLL" \
             /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Yc"stdafx.h" /Fp"Debug\UPDMDll.pch" \
    /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\vc90.pdb" /W0 /nologo /c /ZI /TP /errorReport:prompt

    LINK32=link.exe
    LINK32_FLAGS= /OUT:"$(OUTDIR)\DllTest2.dll" /INCREMENTAL /NOLOGO \
    /DLL /MANIFEST /MANIFESTFILE:"$(OUTDIR)\DllTest2.dll.intermediate.manifest" \
    /MANIFESTUAC:"level='asInvoker' uiAccess='false'" \
    /DEBUG /PDB:"$(OUTDIR)\DllTest2.pdb" /SUBSYSTEM:WINDOWS /DYNAMICBASE \
    /NXCOMPAT /MACHINE:X86 $(OM_LIB) 

    生成的DLL被C#调用失败,求大神解惑!
    采用动态加载Dll,LoadLibrary调用失败,不知道是哪里参数设置有问题。
  2. A
    可调用msbuild实现

为什么用原生的ajax传过去的base64码无法生成成功图片?

  1. Q
    使用HTML5的file api上传图片,并获取到了图片base64编码,然后通过ajax post这串编码过去,保存图片到指定目录中去,可是用jq的ajax成功生成图片,但是用原生的却不行,问题在那儿呢?

    原生的ajax:
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('post','todo.php',true);
    xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=utf-8');
    xmlhttp.setRequestHeader('X_Requested-With','XMLHttpRequest');
    xmlhttp.send('dataurl='+dataurl);

    xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
    console.log(xmlhttp.responseText)
    //alert(xmlhttp.responseText);
    //window.location.href = window.location.href + xmlhttp.responseText;
    }
    }


    jq的ajax:
    $.ajax({
    url:'todo.php',
    type:'post',
    data:{dataurl:dataurl},
    success:function(data){
    console.log(data);
    //alert(data);
    //window.location.href = window.location.href + data;
    }
    });


    完整的代码存放在了:
    http://pan.baidu.com/s/1kT05bzp
  2. A
    jq能成功说明你的程序是好的。但原生js不行肯定是你的js问题,很明显的就是变量没有经过编码直接post过去生成的。
    xmlhttp.send('dataurl='+dataurl);
    改成:
    xmlhttp.send('dataurl='+encodeURIComponent(dataurl));

JAVA 如何搞定方法传任意参

  1. Q
    <code type='java'> int max(int[] data,int len)
           {
                  int result=-1;
                  for(int i=0;i<len;++i)
                  {
                         if(i==0)
                         {
                                result=0;
                         }
                         else
                         {
                                if(data[i]>data[result])
                                       r=i;
                         }
                  }
           }
    </code>
    有没有办法用一个max搞定所有的数据类型呢?(用Java语言)
  2. A
    或者加上泛型的通配符的话……
    import java.util.*;
    
    public class Util {
        public static <T> T max(Iterable<? extends T> items, Comparator<? super T> comparator) {
            T maxItem = null;
            for (T obj : items) {
                if (null == maxItem || 0 < comparator.compare(obj, maxItem)) {
                    maxItem = obj;
                }
            }
            return maxItem;
        }
        
        public static <T> T max(T[] items, Comparator<? super T> comparator) {
            T maxItem = null;
            for (T obj : items) {
                if (null == maxItem || 0 < comparator.compare(obj, maxItem)) {
                    maxItem = obj;
                }
            }
            return maxItem;
        }
    
        public static void main(String[] args) {
            Comparator<Integer> comp = new Comparator<Integer>() {
                public int compare(Integer x, Integer y) {
                    return x - y;
                }
    
                public boolean equals(Object obj) {
                    return obj.getClass() == this.getClass();
                }
            };
            
            Integer[] array = new Integer[] { 2, 1, 4, 0, 3 };
            int maxOfArray = max(array, comp);
            System.out.println(maxOfArray); // 4
            
            Iterable<Integer> list = Arrays.asList(1, 3, 2, -1, 5, 0);
            int maxOfList = max(list, comp);
            System.out.println(maxOfList); // 5
        }
    }

生成动态链接库的问题。怎么才能将obj文件生成dll文件。

  1. Q
    或者将源程序生成dll文件?如果是用vc的工具创建一个动态链接库的话,怎么将源码
    嵌入里面。
  2. A
    例如,在vc中,在ide中选file|new,会弹出对话框,问你要创建哪种工程,选dll即可,然后按照其提示,一步步地做下去就行了。你试试。

生成数据库脚本时,怎么才能让其不生成这两句话!

  1. Q
    using index pctfree 10 initrans 2 maxtrans 255 tablespace INDX storage ( initial 128K next K minextents 1 maxextents unlimited pctincrease freelists freelist groups ) logging
    )
    tablespace USERS storage (initial 128K maxextents unlimited)lob (BZ) store as ( chunk 8192 pctversion 10 nocache logging enable storage in row ) noparallel

    请大家指教!!
  2. A
    你的语句属于Default options for creating a tablespace.可能的解决办法是:
    1。你可以在表空间的属性窗口的Option页中选择是不是要生成这些选项
    2。Database->Edit Current DBMS,在弹出的窗口中选择Script->Objects->TableSpace->Options,可以在右侧看到生成代码模板,你可以不需要的时候删除,但注意做好备份