ASE DES混合加密

合集下载

对称加密----AES和DES加密、解密

对称加密----AES和DES加密、解密

对称加密----AES和DES加密、解密⽬前主流的加密⽅式有:(对称加密)AES、DES (⾮对称加密)RSA、DSA调⽤AES/DES加密算法包最精要的就是下⾯两句话:Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);CBC是⼯作模式,DES⼀共有电⼦密码本模式()、加密分组链接模式()、加密反馈模式()和输出反馈模式()四种模式,PKCS5Padding是填充模式,还有其它的填充模式:然后,cipher.init()⼀共有三个参数:Cipher.ENCRYPT_MODE, key, zeroIv,zeroIv就是初始化向量。

⼯作模式、填充模式、初始化向量这三种因素⼀个都不能少。

否则,如果你不指定的话,那么就要程序就要调⽤默认实现。

代码:1.加密:例:加密⽅式: AES128(CBC/PKCS5Padding) + Base64, 私钥:lianghuilonglong,要加密的字符串abcdefgpublic String encrypt(){ String text = "abcdefg"; //要加密的字符串 String key = "lianghuilonglong"; //私钥 AES固定格式为128/192/256 bits.即:16/24/32bytes。

DES固定格式为128bits,即8bytes。

String iv = "aabbccddeeffgghh"; //初始化向量参数,AES 为16bytes. DES 为8bytes. Key keySpec = new SecretKeySpec(key.getBytes(), "AES"); //两个参数,第⼀个为私钥字节数组,第⼆个为加密⽅式 AES或者DES IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes); Cipher cipher = Cipher.getIntance("AES/CBC/PKCS5Padding"); //实例化加密类,参数为加密⽅式,要写全 cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); //初始化,此⽅法可以采⽤三种⽅式,按服务器要求来添加。

对称可逆加密数学算法

对称可逆加密数学算法

对称可逆加密算法是一种加密和解密使用相同密钥的加密算法。

以下是几种常见的对称可逆加密算法:
1.AES(高级加密标准):AES 是一种常用的对称加密算法,它采用固定长度的明文块
和密钥进行加密,密钥长度可选为 128 位、192 位或 256 位。

解密过程与加密过程相同,使用相同的密钥进行解密。

2.DES 数据加密标准):DES 是一种较早的对称加密算法,它使用 56 位密钥对 64
位明文块进行加密。

解密过程与加密过程相同,使用相同的密钥进行解密。

3.3DES(三重数据加密算法):3DES 是 DES 的一个变种,它使用三个 56 位密钥对
每个 64 位明文块进行三次加密。

解密过程与加密过程相同,使用相同的三个密钥进行解密。

4.Blowfish:Blowfish 是一种对称加密算法,它使用可变长度的密钥对数据进行加密。

解密过程与加密过程相同,使用相同的密钥进行解密。

5.IDEA(国际数据加密算法):IDEA 是一种对称加密算法,它使用 128 位密钥对 64
位明文块进行加密。

解密过程与加密过程相同,使用相同的密钥进行解密。

这些对称可逆加密算法的安全性取决于密钥的保密性。

在理想情况下,只有合法的接收者才能获得密钥并解密密文。

然而,在实际应用中,确保密钥的安全性是一个挑战。

因此,在实际应用中,应该谨慎选择和管理对称可逆加密算法的密钥。

基于aes、rsa算法的多模混合加密系统设计

基于aes、rsa算法的多模混合加密系统设计

第三章A E S 、R S A 多模混合加密系统设计实现基于A E S 、R SA 算法的混合加密系统可以实现A E S 加解密、R SA 加解密和A E S 、R S A 混合加解密。

通过采用可重用设计、流水线等一系列手段来达到系统速度与面积的优化,提高了系统的实用性。

3.1混合加密系统混合加密系统包含A E S 模块、R S A 模块和一些控制逻辑,其具体结构如下图所示:A A E S S—,蘸瘾瘾T T St a aC C n C Cdd d i n--a[127:0]‘ ‘‘‘k即I en [1:0七七......k e v ld a ‘kk k e y 久八尸霎黔戳髓粼纂掣摹I I }黔篡夔麟巍蒸鬓戴蓄鬃纂惑产产t 闷‘‘眨毛溯范i 熟览准抬菠}l 盏男庵约冬{孽}落鱿考邓l l 流漏全咖配庆芝石滋反巍姗址滋李公缓赫}}} 习习R R S A A息息蠢蠢}}&...尸尸ii i 瘾蘸熬巍蘸f s t rrr肇肇蘸)】蘸鑫蘸巍鬓颤髯除黯呀呀摹摹纂l 摹暴l l l 一一~闷卜」卜脚脚趁珍照珍娜不哪嘴翻欲i 脚娜若瞬翻{{薰翼d o u 仁a [1 27:0]r stm o d e[3:0]d i n [127:0]k ey [127:0」d o ut--r[127:0]k e y -ld w e a e skey一d一sare a d y 了图3.1多模混合加密系统结构端口图系统采用全同步设计,一个外部时钟输入,全局复位控制,通过m od e 信号控制加密系统工作模式,所有接口信号描述如下表:表3.1加密系统端口信号表信信号名称称类型型位宽(bi t) ))描述述CC C l kkk 输入入111时钟钟TT T S t tt 输入入1 11复位G 户E 亡竹︶n DS S t a只e l lR R o u n d dS S t a只e r r图3.2轮内流水线示意图在内部流水线结构中,这些分隔得到的组合逻辑电路部分被称为流水站,每个流水站执行不同的处理步骤。

前后端API交互数据加密——AES与RSA混合加密完整实例

前后端API交互数据加密——AES与RSA混合加密完整实例

前后端API交互数据加密——AES与RSA混合加密完整实例 前⾔ 前段时间看到⼀篇⽂章讲如何保证API调⽤时数据的安全性(传送门:),⽂中讲到利⽤RSA来加密传输AES的秘钥,⽤AES来加密数据,并提供如下思路: 说⼈话就是前、后端各⾃⽣成⾃⼰的RSA秘钥对(公钥、私钥),然后交换公钥(后端给前端的是正常的明⽂公钥,前端给后端的是⽤后端公钥加密后的密⽂公钥;PS:其实我觉得直接交换两个明⽂公钥就⾏了),后端⽣成AES的明⽂key,⽤明⽂key进⾏AES加密得到密⽂数据,⽤前端的公钥进⾏RSA加密得到密⽂key,API交互时并将密⽂数据与密⽂key进⾏传输,前端⽤⾃⼰的私钥进⾏RAS解密的到明⽂key,⽤明⽂key进⾏AES解密得到明⽂数据;前端给后端发送数据时同理,这样⼀来,传输的数据都是密⽂,且只有秘钥才能解密 可惜这篇博客只提供了思路,但并没有具体的代码,我们在⽹上查找⼀下资料,开始⽣撸代码,实现⼀个前后端API交互数据加密——AES与RSA混合加密,并应⽤到项⽬中 后端加、解密 从⽹上查找⼯具类,再进⾏改造 先引⼊Base64⼯具类<!-- Base64编码需要 --><dependency><groupId>org.apache.directory.studio</groupId><artifactId>mons.codec</artifactId><version>1.8</version></dependency> AESpackage cn.huanzi.ims.util;import org.apache.tomcat.util.codec.binary.Base64;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.SecureRandom;import java.util.Random;/*** AES加、解密算法⼯具类*/public class AesUtil {/*** 加密算法AES*/private static final String KEY_ALGORITHM = "AES";/*** key的长度,Wrong key size: must be equal to 128, 192 or 256* 传⼊时需要16、24、36*/private static final Integer KEY_LENGTH = 16 * 8;/*** 算法名称/加密模式/数据填充⽅式* 默认:AES/ECB/PKCS5Padding*/private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";/*** 后端AES的key,由静态代码块赋值*/public static String key;static {key = getKey();}/*** 获取key*/public static String getKey() {StringBuilder uid = new StringBuilder();//产⽣16位的强随机数Random rd = new SecureRandom();for (int i = 0; i < KEY_LENGTH / 8; i++) {//产⽣0-2的3位随机数int type = rd.nextInt(3);switch (type) {case 0://0-9的随机数uid.append(rd.nextInt(10));break;case 1://ASCII在65-90之间为⼤写,获取⼤写随机uid.append((char) (rd.nextInt(25) + 65));break;case 2://ASCII在97-122之间为⼩写,获取⼩写随机uid.append((char) (rd.nextInt(25) + 97));break;default:break;}}return uid.toString();}/*** 加密** @param content 加密的字符串* @param encryptKey key值*/public static String encrypt(String content, String encryptKey) throws Exception {//设置Cipher对象Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM));//调⽤doFinalbyte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));// 转base64return Base64.encodeBase64String(b);}/*** 解密** @param encryptStr 解密的字符串* @param decryptKey 解密的key值*/public static String decrypt(String encryptStr, String decryptKey) throws Exception {//base64格式的key字符串转bytebyte[] decodeBase64 = Base64.decodeBase64(encryptStr);//设置Cipher对象Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));//调⽤doFinal解密byte[] decryptBytes = cipher.doFinal(decodeBase64);return new String(decryptBytes);}}AesUtil RSApackage cn.huanzi.ims.util;import mons.codec.binary.Base64;import javax.crypto.Cipher;import java.io.ByteArrayOutputStream;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;/*** RSA加、解密算法⼯具类*/public class RsaUtil {/*** 加密算法AES*/private static final String KEY_ALGORITHM = "RSA";/*** 算法名称/加密模式/数据填充⽅式* 默认:RSA/ECB/PKCS1Padding*/private static final String ALGORITHMS = "RSA/ECB/PKCS1Padding";/*** Map获取公钥的key*/private static final String PUBLIC_KEY = "publicKey";/*** Map获取私钥的key*/private static final String PRIVATE_KEY = "privateKey";/*** RSA最⼤加密明⽂⼤⼩*/private static final int MAX_ENCRYPT_BLOCK = 117;/*** RSA最⼤解密密⽂⼤⼩*/private static final int MAX_DECRYPT_BLOCK = 128;/*** RSA 位数如果采⽤2048 上⾯最⼤加密和最⼤解密则须填写: 245 256*/private static final int INITIALIZE_LENGTH = 1024;/*** 后端RSA的密钥对(公钥和私钥)Map,由静态代码块赋值*/private static Map<String, Object> genKeyPair = new HashMap<>();static {try {genKeyPair.putAll(genKeyPair());} catch (Exception e) {e.printStackTrace();}}/*** ⽣成密钥对(公钥和私钥)*/private static Map<String, Object> genKeyPair() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(INITIALIZE_LENGTH);KeyPair keyPair = keyPairGen.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>(2);//公钥keyMap.put(PUBLIC_KEY, publicKey);//私钥keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/*** 私钥解密** @param encryptedData 已加密数据* @param privateKey 私钥(BASE64编码)*/public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {//base64格式的key字符串转Key对象byte[] keyBytes = Base64.decodeBase64(privateKey);PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);//设置加密、填充⽅式/*如需使⽤更多加密、填充⽅式,引⼊<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk16</artifactId><version>1.46</version></dependency>并改成Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider());*/Cipher cipher = Cipher.getInstance(ALGORITHMS);cipher.init(Cipher.DECRYPT_MODE, privateK);//分段进⾏解密操作return encryptAndDecryptOfSubsection(encryptedData, cipher, MAX_DECRYPT_BLOCK);}/*** 公钥加密** @param data 源数据* @param publicKey 公钥(BASE64编码)*/public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {//base64格式的key字符串转Key对象byte[] keyBytes = Base64.decodeBase64(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicK = keyFactory.generatePublic(x509KeySpec);//设置加密、填充⽅式/*如需使⽤更多加密、填充⽅式,引⼊<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk16</artifactId><version>1.46</version></dependency>并改成Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider());*/Cipher cipher = Cipher.getInstance(ALGORITHMS);cipher.init(Cipher.ENCRYPT_MODE, publicK);//分段进⾏加密操作return encryptAndDecryptOfSubsection(data, cipher, MAX_ENCRYPT_BLOCK);}/*** 获取私钥*/public static String getPrivateKey() {Key key = (Key) genKeyPair.get(PRIVATE_KEY);return Base64.encodeBase64String(key.getEncoded());}/*** 获取公钥*/public static String getPublicKey() {Key key = (Key) genKeyPair.get(PUBLIC_KEY);return Base64.encodeBase64String(key.getEncoded());}/*** 分段进⾏加密、解密操作*/private static byte[] encryptAndDecryptOfSubsection(byte[] data, Cipher cipher, int encryptBlock) throws Exception { int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段加密while (inputLen - offSet > 0) {if (inputLen - offSet > encryptBlock) {cache = cipher.doFinal(data, offSet, encryptBlock);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * encryptBlock;}byte[] toByteArray = out.toByteArray();out.close();return toByteArray;}}RsaUtil 简单测试 AES对称加密、解密简单测试 1、字符串public static void main(String[] args) {//16位String key = "MIGfMA0GCSqGSIb3";//字符串String str = "huanzi.qch@:欢⼦";try {//加密String encrypt = AesUtil.encrypt(str, key);//解密String decrypt = AesUtil.decrypt(encrypt, key);System.out.println("加密前:" + str);System.out.println("加密后:" + encrypt);System.out.println("解密后:" + decrypt);} catch (Exception e) {e.printStackTrace();}}加密前:huanzi.qch@:欢⼦加密后:dXPRtcdHPQSTwxLnmixkaSvNfGHhg5Gz8sGTtiqCpPo=解密后:huanzi.qch@:欢⼦ 2、复杂对象public static void main(String[] args) {//16位String key = "MIGfMA0GCSqGSIb3";//复杂对象ImsUserVo userVo = new ImsUserVo();userVo.setUserName("123456");userVo.setPassword("111111");try {//加密String encrypt = AesUtil.encrypt(userVo.toString(), key);//解密String decrypt = AesUtil.decrypt(encrypt, key);System.out.println("加密前:" + userVo.toString());System.out.println("加密后:" + encrypt);System.out.println("解密后:" + decrypt);} catch (Exception e) {e.printStackTrace();}}加密前:ImsUserVo(id=null, userName=123456, password=111111, nickName=null, gender=null, avatar=null, email=null, phone=null, sign=null, createdTime=null, updataTime=null)加密后:AXv8ewfY+gbuZ/dCmGAxngLry+Idlp1NKZ8yyf9+bmrBggUBo3b+e4XRwMAE/DP+vFS2HpgeYQTrZM1ECjo01uvZ/T6lY7b2C6L8PTotYHQyJM3kOs+YNXL/uyvFZ2EICSQWhmM1XX+g0juHLCbgQDMNXc56S/7eH2p+su1+CTMygUBCF0解密后:ImsUserVo(id=null, userName=123456, password=111111, nickName=null, gender=null, avatar=null, email=null, phone=null, sign=null, createdTime=null, updataTime=null) RAS⾮对称加密、解密简单测试 1、字符串的RSA公钥加密、私钥解密public static void main(String[] args) {//字符串String str = "huanzi.qch@:欢⼦";try {System.out.println("私钥:" + RsaUtil.getPrivateKey());System.out.println("公钥:" + RsaUtil.getPublicKey());//公钥加密byte[] ciphertext = RsaUtil.encryptByPublicKey(str.getBytes(), RsaUtil.getPublicKey());//私钥解密byte[] plaintext = RsaUtil.decryptByPrivateKey(ciphertext, RsaUtil.getPrivateKey());System.out.println("公钥加密前:" + str);System.out.println("公钥加密后:" + Base64.encodeBase64String(ciphertext));System.out.println("私钥解密后:" + new String(plaintext));} catch (Exception e) {e.printStackTrace();}}私钥:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANG08b2L0Hk1QCJXyTUI6A4CqW+KENCedZyJCYMteZ/vx93KeYZbPShhI3IWJJtj9U+ibiAVRjzmikI9lkKdgnCaOgTmEZis2RWgLzhcOpSqdp/J6d+YtmCD6UDeO3E6QPy 公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRtPG9i9B5NUAiV8k1COgOAqlvihDQnnWciQmDLXmf78fdynmGWz0oYSNyFiSbY/VPom4gFUY85opCPZZCnYJwmjoE5hGYrNkVoC84XDqUqnafyenfmLZgg+lA3jtxOkD8n1b/公钥加密前:huanzi.qch@:欢⼦公钥加密后:MQa65DyVZg/L8SBilLX1yUiajtiTBqUFpQ/qlrSRyMGCubylbp9KisowRghPxk9BuI3+ea/4QpidIZKJaZAbQQ+ZKyslSTk3nm6H+0BF9pMA7BUeC33xHSy+3lJrNOr5S+Vup1Oir3Nu8i2vJYQV1pPkB5+zyUVEcNLD3xr/eNQ=私钥解密后:huanzi.qch@:欢⼦ 2、复杂对象的RSA公钥加密、私钥解密public static void main(String[] args) {//复杂对象ImsUserVo userVo = new ImsUserVo();userVo.setUserName("123456");userVo.setPassword("111111");try {System.out.println("私钥:" + RsaUtil.getPrivateKey());System.out.println("公钥:" + RsaUtil.getPublicKey());//公钥加密byte[] ciphertext = RsaUtil.encryptByPublicKey(userVo.toString().getBytes(), RsaUtil.getPublicKey());//私钥解密byte[] plaintext = RsaUtil.decryptByPrivateKey(ciphertext, RsaUtil.getPrivateKey());System.out.println("公钥加密前:" + userVo.toString());System.out.println("公钥加密后:" + Base64.encodeBase64String(ciphertext));System.out.println("私钥解密后:" + new String(plaintext));} catch (Exception e) {e.printStackTrace();}}私钥:MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL6gSKs2G4iFrhPo0aLELfGzsCAaB5hztvclD9J2hZT2KXfs6S5JwZ0RWRR28rqHm0e2RNW3fzYyOLvSoq93n/TRAkmXBbVia3BCTrSzLPrKFY8JvLyXqbrV0NrxywY+4ZlgR 公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+oEirNhuIha4T6NGixC3xs7AgGgeYc7b3JQ/SdoWU9il37OkuScGdEVkUdvK6h5tHtkTVt382Mji70qKvd5/00QJJlwW1YmtwQk60syz6yhWPCby8l6m61dDa8csGPuGZYEeUfrHFmo9y7公钥加密前:ImsUserVo(id=null, userName=123456, password=111111, nickName=null, gender=null, avatar=null, email=null, phone=null, sign=null, createdTime=null, updataTime=null)公钥加密后:Un+1m/CbpzVkkxYrwNOWyEXqpsawxcdv4p3G+9b+SQRiC/THL8YG+IvqFCHnxizzYGB9LEvLbQxw72JB0Wlo1+/SvX7AJb2h0ddpvVUkPjmtXNo073SV1zMK+9NTCJUMMoHu/TIptxRbVxlBoGMHa+jq8h2y3RUOPtx/9zhBWlQmzZE 私钥解密后:ImsUserVo(id=null, userName=123456, password=111111, nickName=null, gender=null, avatar=null, email=null, phone=null, sign=null, createdTime=null, updataTime=null) 如需使⽤更多加密、填充⽅式,引⼊<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk16</artifactId><version>1.46</version></dependency> 加解密的时候改成Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider()); 重要更新 2020-05-21更新 重要Bug修复:后端加解密中,不能在代码⾥new BouncyCastleProvider(),JceSecurity. getVerificationResult内部会进⾏判断,如果是新值,则每次都会put到map中,导致内存缓便被耗尽,程序假死崩溃(参考博客:https:///A/lk5aQo7451/ ) 应该改成,我已经在开源项⽬改了,博客上⾯之前贴出来的代码我就不改了,具体代码⼤家去开源项⽬查看看吧 前端加、解密 AES我们采⽤CryptoJS,是⼀个标准和安全加密算法的JavaScript库,它的AES加密⽀持AES-128、AES-192和AES-256。

混合加密的原理和应用

混合加密的原理和应用

混合加密的原理和应用1. 引言随着网络安全的日益重要,加密技术成为保护信息安全不可或缺的一环。

其中,混合加密是一种常用的加密方法,它结合了对称加密和非对称加密的优势,能够在保证加密强度的同时提高加密效率。

本文将介绍混合加密的原理及其应用。

2. 混合加密的原理混合加密是将对称加密和非对称加密结合起来使用的一种加密方式。

其核心思想是通过非对称加密传输对称加密的密钥,在传输过程中保证密钥的安全性。

具体的混合加密流程如下: 1. 发送方生成一对非对称密钥,包括公钥和私钥,其中公钥用于加密对称密钥,私钥用于解密对称密钥。

2. 发送方使用对称加密算法生成一个随机的对称密钥,并使用该对称密钥对明文进行加密。

3. 发送方使用接收方的公钥对对称密钥进行加密,并将加密后的对称密钥和加密后的密文一起发送给接收方。

4. 接收方收到密文后,使用自己的私钥解密对称密钥。

5. 接收方使用解密后的对称密钥对密文进行解密,得到明文。

通过以上流程,混合加密既保证了对称加密的高效率,又利用非对称加密解决了密钥分发等安全性问题,从而提高了加密的强度和安全性。

3. 混合加密的应用混合加密广泛应用于以下场景:3.1 安全通信混合加密常被用于保护通信过程中的敏感信息,例如在互联网上进行银行转账、在线购物等操作时,为了保护用户的隐私和资金安全,采用混合加密可以有效防止信息被窃取和篡改。

3.2 数字签名混合加密也常被用于数字签名领域。

数字签名是一种验证文件或信息真实性和完整性的技术。

发送方可以通过使用自己的私钥对文件进行签名,接收方可以使用发送方的公钥进行验签。

混合加密技术保证了私钥的安全性,从而保证数字签名的可靠性。

3.3 身份认证混合加密在身份认证中也有重要的应用。

通过私钥签名的方式,发送方可以证明自己的身份。

接收方可以使用发送方的公钥进行解密和验证。

这种方式能够有效防止身份冒充和信息泄露。

3.4 文件加密在文件加密领域,混合加密也被广泛应用。

RSA和DES加密算法详解

RSA和DES加密算法详解
数字签名
RSA算法可以用于生成数字签名,验证数据的完整性和来源,确保数据在传输过程中未 被篡改或伪造。
密钥管理
RSA算法可以用于密钥分发和交换,确保通信双方能够安全地共享密钥,进行加密通信。
DES的应用场景
保护金融交易
DES加密算法曾广泛应用于金融交易中,如 信用卡交易和银行转账,保护敏感信息不被 非法获取。
加密过程
将明文转换为数字后,使用公钥(e,n)进行加密,得到密文。解密过程则使用私钥(d,n)进行解密,还原出明文。
RSA算法的安全性
安全性基于大数因子分解
RSA算法的安全性主要基于大数因子分解的困难性。即使攻击者知道了公钥和密文,也很难通过计算 得到原始的明文。
密钥长度决定安全性
RSA算法的安全性取决于密钥长度。一般来说,密钥长度越长,RSA算法的安全性就越高。目前常用 的RSA密钥长度为2048位,被认为是足够安全的。
缺点
01
计算开销大
RSA加密算法相对于DES加密算法需要更多的计算资源和时间,因此在
处理大量数据时可能效率较低。
02
密钥长度较长
为了达到足够的安全强度,RSA加密算法通常需要较长的密钥长度(例
如2048位),这会增加实现和存储密钥的难度和成本。
03
可能遭受侧信道攻击
虽然RSA加密算法本身不容易遭受侧信道攻击,但在某些实现中可能会
暴露密钥信息,从而遭受攻击。
05
DES加密算法的优缺点
优点
安全性高
DES加密算法使用56位密钥,在256次试验中密和解密过程中速度较 快。
易实现
DES算法易于理解和实现,因此在许多编程语言中都 有现成的库可供使用。
缺点
密钥长度短

RSA DES 加密解密

RSA DES 加密解密

DES 原理
• 1 初始置换 • 其功能是把输入的64位数据块按位重新组合,并把输出分 为L0、R0两部分,每部分各长3 2位,其置换规则为将输入 的第58位换到第一位,第50位换到第2位……依此类推,最 后一位是原来的第7位。L0、R0则是换位输出后的两部分, L0是输出的左32位,R0是右32位,例:设置换前的输入值为 D1D2D3……D64,则经过初始置换后的结果 为:L0=D58D50……D8;R0=D57D49……D7。 • 2 逆置换 • 经过16次迭代运算后,得到L16、R16,将此作为输入,进行 逆置换,逆置换正好是初始置换的逆运算,由此即得到密 文输出。
RSA DES 加密解密
RSA 原理
• • • • • • • • • • • • • • • • • • 找两素数p和q 取n=p*q 取t=(p-1)*(q-1) 取任何一个数e,要求满足e<t并且e与t互素(就是最大公因数为1) 取d*e%t==1 这样最终得到三个数: n d e 设消息为数M (M <n) 设c=(M**d)%n就得到了加密后的消息c 设m=(c**e)%n则 m == M,从而完成对c的解密。 注:**表示次方,上面两式中的d和e可以互换。 在对称加密中: n d两个数构成公钥,可以告诉别人; n e两个数构成私钥,e自己保留,不让任何人知道。 给别人发送的信息使用e加密,只要别人能用d解开就证明信息是由你发送的,构成了签名机制。 别人给你发送信息时使用d加密,这样只有拥有e的你能够对其解密。 rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解 从而在已知n d的情况下无法获得e;同样在已知n e的情况下无法 求得d。
谢谢观赏

DES和RSA两种加密算法

DES和RSA两种加密算法

DES和RSA两种加密算法DES(Data Encryption Standard)和RSA(Rivest, Shamir, 和Adleman)是两种广泛使用的加密算法,被用于保护敏感信息的安全性。

它们具有不同的加密和解密过程,并在不同应用场景中发挥作用。

DES是一种对称加密算法,它使用相同的密钥进行加密和解密操作。

它采用了经典的分组密码结构,将明文分成固定大小的块,并进行相同数量的加密和解密轮。

DES密钥的长度为56位,被分为64位进行轮次加密。

由于密钥长度较短,使得DES对于现代密码分析算法的攻击比较脆弱。

因此,DES已经被更安全和更可靠的加密算法所替代。

RSA是一种非对称加密算法,它使用两个密钥,一个公钥和一个私钥。

公钥用于加密数据,而私钥用于解密数据。

RSA的安全性基于质因数分解问题的困难性,即将大质数做乘法分解的困难性。

RSA密钥的长度可变,通常在1024位到4096位之间。

RSA算法广泛应用于数字签名、密钥交换和安全通信等领域。

尽管DES和RSA都是加密算法,但它们适用的场景和特点有所不同。

首先,DES是一种对称加密算法,而RSA是一种非对称加密算法。

这意味着在使用DES时,相同的密钥用于加密和解密,而在使用RSA时,不同的密钥用于加密和解密。

这使得RSA在密钥管理和分发方面更加便捷,但加解密的性能开销更大。

其次,DES的密钥长度较短,使得它更易受到暴力破解和密码分析的攻击。

相比之下,RSA的安全性基于质因数分解问题,要求较长的密钥长度,增加了攻击者找到合适的密钥的难度。

此外,DES和RSA在加密速度上也存在差异。

由于DES是对称加密算法,它的加密和解密速度通常较快。

相比之下,由于RSA是非对称加密算法,它的加密速度较慢。

这使得DES通常适用于要求高速加密的场景,而RSA适用于安全性要求较高的场景。

最后,DES和RSA在应用领域上有所不同。

由于DES已经被认为不再安全,它主要应用于旧系统或需要与遗留系统兼容的场景。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学与计算机学院密码学实验报告年级2009级学号2009432133 姓名王祥辉成绩专业网络工程实验地点主楼502 指导教师常卓实验项目RSA、DES混合加密算法实验日期2012年10月31日实验报告要求:一、实验目的1. 掌握RSA和DES混合加密的原理,及网络传输的实现方法。

2. 基于RSA和DES混合加密技术,编写网络加密传输程序。

二、实验原理发送方接收方三、实验要求非对称加密算法的计算时间长,对于网络传输信息的实时性有很大影响。

而对称加密算法的运算效率高,适用于实际信息的加密。

如果将两者结合起来,就可以实现综合效果,通过网络加密传输大量的重要信息。

采用RSA和DES混合加密技术,结合网络传输的知识,编写一个网络信息加密传输程序。

四、实验步骤、结果(程序+注释+截图)及分析(一)程序代码1.发送信息string myenc=EncryptDES(this.richTextBoxSend.Text,sencryptKey);string str=myenc;int i=str.Length;if(i==0){return; }else{i*=2;} //因为str为Unicode编码,每个字符占字节,所以实际字节数应*2byte[] datasize=new byte[4];datasize=System.BitConverter.GetBytes(i); //将位整数值转换为字节数组byte[] sendbytes=System.Text.Encoding.Unicode.GetBytes(str); //转字节数组try{ NetworkStream netStream=new NetworkStream(clientSocket); //首字节记录发送数据大小netStream.Write(datasize,0,4); //发送记录发送数据大小的数据netStream.Write(sendbytes,0,sendbytes.Length); //发送数据netStream.Flush();this.richTextBoxSend.Rtf="";}2.获取公钥MemoryStream ms = new MemoryStream(); //创建MemoryStream流BinaryFormatter bf = new BinaryFormatter(); //二进制格式化NetworkStream netStream=new NetworkStream(clientSocket); //创建NetworkStream流byte[] datasize=new byte[4]; //存放首字节netStream.Read(datasize,0,4); //从NetworkStream流读int size=System.BitConverter.ToInt32(datasize,0); //确定传送数据的大小Byte[] message=new byte[size]; //存放数据int dataleft=size; //剩余的要读取字节数int start=0; //起始位置while(dataleft>0) //读取过程{ int recv=netStream.Read(message,start,dataleft);ms.Write(message, 0, recv);start+=recv;dataleft-=recv; }ms.Position=0; //MemoryStream操作位置标记规零rsa = new RSACryptoServiceProvider();rsa.KeySize = 1024;rsa.ImportParameters((RSAParameters)bf.Deserialize(ms)); //得到从MemoryStream经反序列化的公钥string publickey=rsa.ToXmlString(false); //公钥转字符串3.公钥加密DES密钥byte[] symKeyEncrypted;//对称加密密钥byte[] symIVEncrypted;//对称加密初始化向量NetworkStream ns = new NetworkStream(clientSocket);//创建NetworkStream流symm = new TripleDESCryptoServiceProvider();symm.KeySize = 192;symKeyEncrypted = rsa.Encrypt(Encoding.UTF8.GetBytes(sencryptKey), false);//使用RSA 算法对数据进行加密************symIVEncrypted = rsa.Encrypt(Keys, false);//keys为要加密的数据,参数为true则使用OAEP 填充(仅在运行Microsoft Windows XP 或更高版本的计算机上可用)执行直接的RSA 加密。

否则,如果为false,则使用PKCS#1 1.5 版填充。

返回值int i=symKeyEncrypted.Length;//对称加密密钥长度byte[] datasize=new byte[4];//存放首字节datasize=System.BitConverter.GetBytes(i);//将指定的数据转换为字节数组ns.Write(datasize,0,4);//向netstream流写;datasize为类型Byte 的数组,该数组包含要写入NetworkStream 的数据。

0为buffer 中开始写入数据的位置;为要写入NetworkStream 的字节数ns.Write(symKeyEncrypted, 0, symKeyEncrypted.Length);ns.Flush();//刷新流中的数据int j=symIVEncrypted.Length;//对称加密初始化向量的长度byte[] datasize2=new byte[4];datasize2=System.BitConverter.GetBytes(i);//将指定的数据转换为字节数组ns.Write(datasize2,0,4);ns.Write(symIVEncrypted, 0, symIVEncrypted.Length);ns.Flush();4.DES加密解密加密:byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0,8));byte[] rgbIV = Keys;//初始化向量byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);//需要加密的明文转为字节数组DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();//创建DESCryptoServiceProvider 对象MemoryStream mStream = new MemoryStream();//CryptoStream cStream = newCryptoStream(mStream,dCSP.CreateEncryptor(rgbKey,rgbIV),CryptoStreamMode.Write);cStream.Write(inputByteArray,0,inputByteArray.Length);//将一个字节序列写入当前CryptoStream,并将流中的当前位置提升写入的字节数。

为buffer 中的字节偏移量cStream.FlushFinalBlock();//用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。

return Convert.ToBase64String(mStream.ToArray());//将指定的由以64 为基的数字组成的值的String 表示形式转换为等效的8 位无符号整数数组。

解密:byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);byte[] rgbIV = Keys;//初始化向量byte[] inputByteArray = Convert.FromBase64String(decryptString);//将指定的由以64 为基的数字组成的值的String 表示形式转换为等效的8 位无符号整数数组。

DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = newCryptoStream(mStream,DCSP.CreateDecryptor(rgbKey,rgbIV),CryptoStreamMode.Write);cStream.Write(inputByteArray,0,inputByteArray.Length);//将一个字节序列写入当前CryptoStream,并将流中的当前位置提升写入的字节数。

/inputByteArray为字节数组。

此方法将inputByteArray.Length个字节从0复制到当前流。

cStream.FlushFinalBlock();//用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。

return Encoding.UTF8.GetString(mStream.ToArray());//返回解密后的数组 MemoryStream ToArray5.获得对称密钥private void getSymmetricKey(Socket socket)//获得对称密钥{ NetworkStream netStream=new NetworkStream(socket);byte[] datasize=new byte[4];//字节数组netStream.Read(datasize,0,4);//读取个字节int size=System.BitConverter.ToInt32(datasize,0);//返回由字节数组中指定位置的四个字节转换来的32 位有符号整数。

Byte[] message=new byte[size];//int dataleft=size;int start=0;while(dataleft>0){ int recv=netStream.Read(message,start,dataleft);start+=recv;dataleft-=recv; }symm = new TripleDESCryptoServiceProvider();//TripleDESCryptoServiceProvider对象实例化symm.KeySize = 192;byte[] decryptKey = rsa.Decrypt(message,false);//使用RSA 算法对数据进行解密//message是要解密的数据如果为true,则使用OAEP 填充(仅在运行Microsoft Windows XP 或更高版本的计算机上可用)执行直接的RSA 解密;否则,如果为false,则使用PKCS#1 1.5 版填充。

相关文档
最新文档