开发者社区> 问答> 正文

请教RSA和AES加密的算法,JAVA,C#,C++可以做交互通用组件!

请各位大侠,如果有第三方控件,请不吝赐送,在此表示万分感谢!

展开
收起
知与谁同 2018-07-16 15:58:03 2076 0
1 条回答
写回答
取消 提交回答
  • import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.SecureRandom;

    import javax.crypto.Cipher;

    public class RSACrypto
    {
    private final static String RSA = "RSA";
    public static PublicKey uk;
    public static PrivateKey rk;

    public static void generateKey() throws Exception
    {
    KeyPairGenerator gen = KeyPairGenerator.getInstance(RSA);
    gen.initialize(512, new SecureRandom());
    KeyPair keyPair = gen.generateKeyPair();
    uk = keyPair.getPublic();
    rk = keyPair.getPrivate();
    }

    private static byte[] encrypt(String text, PublicKey pubRSA) throws Exception
    {
    Cipher cipher = Cipher.getInstance(RSA);
    cipher.init(Cipher.ENCRYPT_MODE, pubRSA);
    return cipher.doFinal(text.getBytes());
    }

    public final static String encrypt(String text)
    {
    try {
    return byte2hex(encrypt(text, uk));
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    return null;
    }

    public final static String decrypt(String data)
    {
    try{
    return new String(decrypt(hex2byte(data.getBytes())));
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    return null;
    }

    private static byte[] decrypt(byte[] src) throws Exception
    {
    Cipher cipher = Cipher.getInstance(RSA);
    cipher.init(Cipher.DECRYPT_MODE, rk);
    return cipher.doFinal(src);
    }

    public static String byte2hex(byte[] b)
    {
    String hs = "";
    String stmp = "";
    for (int n = 0; n < b.length; n ++)
    {
    stmp = Integer.toHexString(b[n] & 0xFF);
    if (stmp.length() == 1)
    hs += ("0" + stmp);
    else
    hs += stmp;
    }
    return hs.toUpperCase();
    }

    public static byte[] hex2byte(byte[] b)
    {
    if ((b.length % 2) != 0)
    throw new IllegalArgumentException("长度不是偶数");

    byte[] b2 = new byte[b.length / 2];

    for (int n = 0; n < b.length; n += 2)
    {
    String item = new String(b, n, 2);
    b2[n/2] = (byte)Integer.parseInt(item, 16);
    }
    return b2;
    }

    //just for test
    public static void main(String args[])
    {
    try
    {
    RSACrypto.generateKey();
    String cipherText = RSACrypto.encrypt("asdfghjh");
    System.out.println(cipherText);
    String plainText = RSACrypto.decrypt(cipherText);
    System.out.println(plainText);
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }

    }
    2019-07-17 22:56:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载