`
qiujian_xf
  • 浏览: 3083 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

MD5、DES、RSA消息加密解密

阅读更多
   最近做的一个项目中用到这几种加密解密算法,简单总结下用法。
一 MD5、DES、RSA的基本概念?
      相信大家多多少少都接触过一些加密解密算法,MD5可以说是最常用的一种了,MD5是直接对要加密信息进行加密的消息摘要算法,DES是一种对称加密算法,RSA则是一种非对称加密算法。

     所谓对称加密是一种将原始数据(需加密消息)和加密密钥key一起经过特殊加密算法处理,在解密时使用同一密钥(加密时使用的加密密钥key)与加过密的数据一起经过相同算法的逆算法对密文进行解密。

     非对称加密是借助匹配的一对密钥(公钥publicKey 和私钥privateKey),加密时借助公钥和原始数据(需加密消息)一起经过特殊加密算法处理,解密时采用私钥和加过密的数据进过逆算法对密文进行解密;或者加密时使用私钥进行加密,解密时使用公钥进行解密。

1、java(jdk1.6)中java.security.MessageDigest抽象类为应用程序提供信息摘要算法的功能,用法也非常简单。
  
  MessageDigest md = MessageDigest.getInstance("MD5"); // 初始化
	
  byte b_data [] = dataString.getByte();  // 加密前先将需加密数据(字符串dataString)转成byte[]
        
  byte md5_result [] = md.digest(b_data); // 加密返回摘要信息

2、DES算法,首先需要生成一个密钥key,这里采用随机数生成,然后根据这个密钥进行加密解密操作。
SecureRandom sr = new SecureRandom(); // DES算法要求有一个可信任的随机数源
        KeyGenerator desKg = KeyGenerator.getInstance("DES"); // 为DES算法生成一个KeyGenerator对象
        desKg.init(sr);  

        SecretKey key = desKg.generateKey(); //获取密钥对象

        byte[]  rawKeyData = key.getEncoded(); // 生成DES密钥


/**
     * 利用DES算法加密二进制数据
     * rawKeyData  密钥key | rawOrignData 需加密数据 
     * @param rawKeyData byte[]
     * @param byOrignData byte[]
     * @return byte[]
     */
    public static byte[] desEncrypt(byte[] rawKeyData,byte[] rawOrignData) throws Exception
    {
        // DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();

        // 从原始密匙数据创建DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(rawKeyData);

        // 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(dks);

        // Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance("DES");

        // 用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, key, sr);

        // 现在,获取数据并加密
        byte encryptedData[] = cipher.doFinal(rawOrignData);

        // 返回加密后的数据
        return encryptedData;
    }

    /**
     * 利用DES算法解密二进制数据
     * rawKeyData 密钥key | rawCryptograph 需解密数据
     * @param rawKeyData byte[]
     * @param rawCryptograph byte[]
     * @return byte[]
     */
    public static byte[] desDecrypt(byte[] rawKeyData,byte[] rawCryptograph) throws Exception
    {
        // DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();

        // 从原始密匙数据创建一个DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(rawKeyData);

        // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成一个SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(dks);

        // Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance("DES");

        // 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, key, sr);

        // 正式执行解密操作
        return cipher.doFinal(rawCryptograph);
    }


3、RSA算法,首先需要生成密钥对(公钥publicKey、私钥privateKey),这里采用随机数产生,然后根据密钥对进行加密解密操作。
// 为RSA算法,这里借助了jar包 bcprov-jdk14-145.jar 用来生成一个KeyPairGenerator对象
            KeyPairGenerator  kpg = KeyPairGenerator.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());
           
            //指定密钥的长度,初始化密钥对生成器 (这里假设密钥长度为1024)
            SecureRandom ran = new SecureRandom();
            kpg.initialize(1024, ran);

            KeyPair keyPair = kpg.genKeyPair(); //生成密钥对

            //获取公钥
            RSAPublicKey pbkey = (RSAPublicKey) keyPair.getPublic();
            BigInteger PublicExponent = pbkey.getPublicExponent(); // 从RSA密钥对中获取公有指数
            
            //或者获取私钥
            RSAPrivateKey prkey = (RSAPrivateKey)keyPair.getPrivate();
            BigInteger PrivateExponent = prkey.getPrivateExponent(); //从RSA密钥对中获取私有指数

            BigInteger Modulus = pbkey.getModulus(); // RSA 密钥对中用到的一个公共系数

            //(RSA公钥对象是有PublicExponent + Modulus 生成的,私钥对象是有rivateExponent + Modulus生成的)

/**
     * 根据系数和指数生成公钥
     * @param Modulus BigInteger
     * @param PublicExponent BigInteger
     * @return void
     */
    private static RSAPublicKey generateRSAPublicKey(BigInteger Modulus, BigInteger PublicExponent) throws Exception {

        KeyFactory keyFac = null;

        try {

            keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

        } catch (NoSuchAlgorithmException ex) {

            throw new Exception(ex.getMessage());

        }

        RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(Modulus, PublicExponent);

        try {

            return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);

        } catch (InvalidKeySpecException ex) {

            throw new Exception(ex.getMessage());

        }
    }

    /**
     * 根据系数和指数生成私钥
     * @param Modulus BigInteger
     * @param PrivateExponent BigInteger
     * @return void
     */
    private static RSAPrivateKey generateRSAPrivateKey(BigInteger Modulus, BigInteger PrivateExponent) throws Exception {

        KeyFactory keyFac = null;

        try {
            keyFac = KeyFactory.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider());

        } catch (NoSuchAlgorithmException ex) {

            throw new Exception(ex.getMessage());

        }

        RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(Modulus, PrivateExponent);

        try {

            return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);

        } catch (InvalidKeySpecException ex) {

            throw new Exception(ex.getMessage());
        }
    }


/**   
  * RSA加密
  * Encrypt method  
  *   
  * @return byte[]   
  */   
  protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) {   
	  if (publicKey != null) {   
		  try {   
			  Cipher cipher = Cipher.getInstance("RSA",  new org.bouncycastle.jce.provider.BouncyCastleProvider());   
			  cipher.init(Cipher.ENCRYPT_MODE, publicKey);   
			  return cipher.doFinal(data);   
		  } catch (Exception e) {   
			  e.printStackTrace();   
		  }   
	  }   
	  return null;   
  }   
    
/**   
  * RSA解密
  * decrypt method   
  *   
  * @return byte[]   
  */   
  protected byte[] decrypt(RSAPrivateKey privateKey, byte[] raw) {   
	  if (privateKey != null) {   
	       try {   
		      Cipher cipher = Cipher.getInstance("RSA",  new org.bouncycastle.jce.provider.BouncyCastleProvider());   
		      cipher.init(Cipher.DECRYPT_MODE, privateKey);   
		      return cipher.doFinal(raw);   
	       } catch (Exception e) {   
		      e.printStackTrace();   
	       }   
	  }   
	    
	  return null;   
  }   
分享到:
评论

相关推荐

    跨平台 AES MD5 ECC DES RSA 加密解密 支持 进度 支持多种编码.源码.FlyUtils_md5加密解密工具类

    本文将详细介绍标题和描述中提到的几种加密算法:AES、MD5、ECC、DES以及RSA,并结合源码库"FlyUtils"探讨它们在跨平台环境下的应用,以及如何支持进度显示和多种编码。 首先,AES(Advanced Encryption Standard)...

    MD5 & DES & RSA 加密解密

    winform做的一个小工具(源码),包括MD5加密、DES加密解密,RSA公钥密钥生成,RSA加密解密这几个功能。 pc6上找到的,不知道原作者是谁,感谢之。

    MD5加密,DES,RSA加解密工具

    在给定的"MD5加密,DES,RSA加解密工具"中,用户可以通过Encoder.exe文件实现这三种加密方式的操作。MD5用于快速校验数据完整性,而DES和RSA则提供加密服务。DES适合大量数据的加密,因为其速度较快,但需要保证密钥...

    des加密解密MD5签名RSA加密解密

    总共两个用户 A和B, A负责加密,B解密。用Java编写界面。 首先A用DES对选定文件加密,用hash函数对明文提取hash值,RSA对hash值加密, 然后B对加密的文件解密,对A的s值解密,比较两个值

    简易的MD5.DES.RSA加密解密程序

    MD5、DES和RSA是三种常见的加密算法,在信息安全领域中广泛应用。这个简易的加密解密程序结合了这三种算法,提供了对文本数据的加解密功能。下面将详细阐述这三种算法及其在程序中的作用。 1. **MD5(Message-...

    MFC vc6.0 RSA DES MD5 加密解密算法

    总之,"MFC vc6.0 RSA DES MD5 加密解密算法"是一个涉及非对称加密、对称加密以及消息摘要的综合应用,开发者需要理解这些算法的原理,并在MFC环境中实现它们,以保证数据的安全传输和存储。通过图形化界面,使得...

    RSA加密解密工具,用于文件的加密和解密* RSA加密解密:私钥解密,公钥加密

    在本压缩包中,提供了RSA加密解密的工具——PRO_TDES_RSA.exe,这是一个执行程序,能够帮助用户对文件进行加密和解密操作。结合"RSATool工具简易操作指南 .doc",用户可以详细了解如何使用这个工具来保护他们的敏感...

    Hash MD5 DES AES RSA加解密实例

    本文将详细讲解四种常见的加密算法:MD5、DES、AES和RSA,以及它们在实际应用中的加解密实例。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它可以将任意长度的数据转化为固定长度的摘要。...

    OpenSSL RSA AES加密解密C++源码

    在C++中使用OpenSSL库进行RSA加密解密,需要完成以下步骤: 1. **生成RSA密钥对**:首先,我们需要创建一个RSA结构体,并生成一对密钥。这通常包括调用`RSA_generate_key_ex()`函数,指定密钥长度(如2048位)和...

    RSA结合DES加密解密大数据

    4. 将所有DES加密的数据块和RSA加密的DES密钥打包成一个文件或消息,发送给接收方。 5. 接收方收到后,使用自己的私钥解密RSA加密的DES密钥。 6. 使用解密出的DES密钥,对每个数据块进行解密,恢复原始数据。 这种...

    [CryptAPI]纯windowsAPI计算AES/DEA/3DES,RSA加密解密,RSA签名验签,HMAC,散列等

    RSA公钥加密/私钥解密。RSA签名/验签。各种散列:MD2/MD4/MD5,SHA/SHA1/SHA256/SHA384/SHA512。HMAC算法,支持 hmac-md5 hmac-sha1 hmac-sha256 hmac-384 hmac-sha512。PEM文件纯易语言解析,载入,导出。FPX文件...

    DES 3DES RSA 的实现加密解密算法

    总之,理解并正确使用DES、3DES和RSA加密算法对于保护敏感数据至关重要。在C#环境中,我们可以借助.NET Framework提供的类库轻松实现这些加密解密功能,并结合Winform开发出直观易用的应用程序。在实际项目中,应...

    DES_RSA_MD5加密解密.rar_RSA技术_des_md5_md5 加密_rsa

    实现对称加密解密技术DES,非对称加密解密技术RSA,MD5

    C#加密解密DeEncryptHelper.zip

    MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证

    3DES和RSA加密解密算法,简单实用,直接放参数即可

    在提供的压缩包文件中,"3DES和RSA加密解密算法"很可能包含了一些示例代码或者库,帮助开发者理解和实现这两种加密算法。学习和理解这些代码可以帮助我们更好地运用这些技术,为我们的项目提供强大的安全保障。 总...

    MD5加密, DES加密解密, RAS加密解密演示实例

    本文将详细介绍C#环境下实现的MD5、DES和RSA这三种常见的加密解密方法,并通过实际的编程实例来展示它们的用法。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能将任意长度的数据转化为...

    js前台通过RSA,DES加解密,java后台解密、加密

    **RSA加密解密** RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它的核心特点是有一对公钥和私钥。公钥用于加密,任何人都可以获取;而私钥用于解密,必须保密。在Web应用中,前端可以使用公钥对数据加密,...

    3个著名加密算法(MD5、RSA、DES)的解析

    ### 3个著名加密算法(MD5、RSA、DES)的解析 #### 一、MD5算法 **MD5** 的全称是 **Message-Digest Algorithm 5**,这是一种广泛使用的散列函数,用于生成固定长度(128位)的摘要。MD5算法最初是由MIT的计算机科学...

    Java实现文件的RSA和DES加密

    Java 实现文件的 RSA 和 DES 加密 在现代密码技术中,根据密钥类型的不同,可以将其分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称加密算法用来对敏感数据等信息进行加密,常用的...

Global site tag (gtag.js) - Google Analytics