非对称加密算法

高级

双保险

公钥,私钥

DH 密钥交换算法(是非对称加密的起源)

RSA 基于因子分解(应用范围最广,既能用于数据加密,也能用于数字签名)

ElGamal  基于离散对数

ECC   椭圆曲线加密


DH

对称加密算法提供了数据的安全性,同时也带来了密钥管理复杂性,如果想要发送加密的信息,必须事先约定好相同的算法,双方持有相同的密钥。密钥传递过程复杂,一旦密钥泄露,数据将很快的被破解掉。这就是对称加密带来的困扰

密钥交换算法是通过构建本地密钥来解决这种对称加密带来的问题。

DH实现过程以及相关类:

1.初始化发送方密钥

KeyPairGenerator   KeyPair常用的密钥的载体(密钥队)。包含两个信息,公钥publickey私钥privatekey。

KeyPair  能够得到公钥私钥

PublicKey公钥

2.初始化接收方密钥

KeyFactory密钥工厂,生成密钥

X509EncodedKeySpec类根据ASN.1标准进行密钥编码

DHPublicKey就是PublicKey具体的形式

DhParameterSpec随同DH使用的参数的集合(DH使用的参数都会放到这个集合中来使用)

KeyPairGenerator

PrivateKey私钥

3.密钥构建

KeyAgreement用来提供密钥一致性(或密钥交换)协议的功能。

SecretKey秘密密钥 对称密钥,生成一个分组的秘密密钥,提供了安全性的一些操作

KeyFactory

X509EncodedKeySpec

PublicKey

4.加密,解密

Cipher为加密解密提供密码功能的一个类

DH实现:

//1.初始化发送方密钥

    KeyPairGenerator sendKeyPairGenerator = KeyPairGenerator.getInstance("DH");

    //设置它的长度

    sendKeyPairGenerator.initialize(512);

    KeyPair sendKeyPair = sendKeyPairGenerator.generateKeyPair();

    //发送方公钥的载体 需要发送给接收方(网络,文件。。)

    byte[] sendPublicKeyEnc = sendKeyPair.getPublic().getEncoded();

//2.初始化接收方的密钥

    KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");

    X509EncodedKeySpec x509EncodedKeySpec =new X509EncodedKeySpec(sendPublicKeyEnc);

    PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);

    //读取参数,再用这个参数去生成他自己的密钥

    DHParameterSpec dhParameterSpec = ((DHPublicKey) receiverPublicKey).getParams();

    KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");

    receiverKeyPairGenerator.initialize(dhParameterSpec);

    KeyPair receiverKeyPair = receiverKeyPairGenerator.generateKeyPair();

//3.密钥构建

    KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");

    receiverKeyAgreement.init(receiverKeyPair.getPrivate());

    receiverKeyAgreement.doPhase(receiverPublicKey,true);

    SecretKey receiverDesKey = receiverKeyAgreement.generateSecret("DES");

    byte[] receiverPublicKeyEnc = receiverKeyPair.getPublic().getEncoded();

    KeyFactory sendKeyFactory = KeyFactory.getInstance("DH");

    x509EncodedKeySpec =new X509EncodedKeySpec(receiverPublicKeyEnc);

    PublicKey sendPublicKey = sendKeyFactory.generatePublic(x509EncodedKeySpec);

    KeyAgreement sendKeyAgreement = KeyAgreement.getInstance("DH");

    sendKeyAgreement.init(sendKeyPair.getPrivate());

    sendKeyAgreement.doPhase(sendPublicKey,true);

    //发送方的本地密钥

    SecretKey sendDesKey = sendKeyAgreement.generateSecret("DES");

    if(sendDesKey.equals(receiverDesKey)){

Log.d(TAG, "initDH: 双方密钥相同");

    }

//4.加密

    Cipher cipher = Cipher.getInstance("DES");

    cipher.init(Cipher.ENCRYPT_MODE,sendDesKey);

    byte[] result = cipher.doFinal(src.getBytes());

    Log.d(TAG, "initDH: "+Base64.encodeToString(receiverPublicKeyEnc,0));

//5.解密

    cipher.init(Cipher.DECRYPT_MODE,receiverDesKey);

    result = cipher.doFinal(result);

    Log.d(TAG, "initDH: "+new String(result));

RSA

唯一广泛接收并实现的一个非常通用并公开的算法。

数字加密,数字签名都会用到。

公钥加密,私钥解密

私钥加密,公钥解密

例:

//初始化密钥

try {

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

    keyPairGenerator.initialize(512);

    KeyPair keyPair = keyPairGenerator.generateKeyPair();

    RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();

    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();

    Log.d(TAG, "initRSA: "+Base64.encodeToString(rsaPublicKey.getEncoded(),0));

    Log.d(TAG, "initRSA: "+Base64.encodeToString(rsaPrivateKey.getEncoded(),0));

    //加密

    PKCS8EncodedKeySpec pkcs8EncodedKeySpec =new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

    Cipher cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.ENCRYPT_MODE,privateKey);

    byte[] result = cipher.doFinal(src.getBytes());

    Log.d(TAG, "initRSA: +++"+Base64.encodeToString(result,0));

    //解密  公钥解密 私钥加密

    X509EncodedKeySpec x509EncodedKeySpec =new X509EncodedKeySpec(rsaPublicKey.getEncoded());

    keyFactory = KeyFactory.getInstance("RSA");

    PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

    cipher = Cipher.getInstance("RSA");

    cipher.init(Cipher.DECRYPT_MODE,publicKey);

    result = cipher.doFinal(result);

    Log.d(TAG, "initRSA: ---"+new String(result));

    //加密  公钥加密 私钥解密

//解密  公钥加密 私钥解密

}catch (Exception e) {

e.printStackTrace();

}

RSA私钥加密,公钥解密:

1.发送者使用私钥加密数据

2.发送加密数据

3.接收者使用公钥解密数据

RSA公钥加密,私钥解密:

1.发送者使用公钥加密数据

2.发送加密数据

3.接收者使用私钥解密数据

ElGamal

和RSA不同的是只提供公钥加密算法。

jdk并没有提供给他的实现,他的实现是通过Bouncy Castle来提供的。

构建密钥和RSA基本上是一致的。算是RSA的一种补充。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容