加密解密 CTR IGE DH等

2023-10-28 06:50
文章标签 解密 加密 dh ctr ige

本文主要是介绍加密解密 CTR IGE DH等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么80%的码农都做不了架构师?>>>   hot3.png

加密解密

块加密

AES

IGE 模式

ige github例子

分组模式

CTR 模式

CTR 全称为计数器模式(Counter mode),该模式由 Diffe 和 Hellman 设计。一种分组密码的模式

DH 秘钥交换算法

一种密钥交换协议,注意该算法只能用于密钥的交换,而不能进行消息的加密和解密。双方确定要用的密钥后,要使用其他对称密钥操作加密算法实际加密和解密消息。它可以让双方在不泄漏密钥的情况下协商出一个密钥来, 常用于保证对称加密的秘钥的安全, TLS就是这样做的。

  • DH:ECDH是DH的加强版
  • ECDH: DH算法的加强版, 常用的是NIST系列,但是后面curve25519
  • curve25519: 实质上也是一种ECDH,但是其实现更为优秀,表现的更为安全,可能是下一代秘钥交换算法的标准。
DH go 的实现

引用git: dh go实现

// Use of this source code is governed by a license
// that can be found in the LICENSE file.// Package dh implements the Diffie-Hellman key exchange over
// multiplicative groups of integers modulo a prime.
// This also defines some commen groups described in RFC 3526.
package dhimport (cryptorand "crypto/rand""errors""io""math/big"
)var zero *big.Int = big.NewInt(0)
var one *big.Int = big.NewInt(1)
var two *big.Int = big.NewInt(2)// IsSafePrime returns true, if the prime of the group is
// a so called safe-prime. For a group with a safe-prime prime
// number the Decisional-Diffie-Hellman-Problem (DDH) is a
// 'hard' problem. The n argument is the number of iterations
// for the probabilistic prime test.
// It's recommend to use DDH-safe groups for DH-exchanges.
func IsSafePrimeGroup(g *Group, n int) bool {q := new(big.Int).Sub(g.P, one)q = q.Div(q, two)return q.ProbablyPrime(n)
}// PublicKey is the type of DH public keys.
type PublicKey *big.Int// PrivateKey is the type of DH private keys.
type PrivateKey *big.Int// Group represents a mathematical group defined
// by a large prime and a generator.
type Group struct {P *big.Int // The primeG *big.Int // The generator
}// GenerateKey generates a public/private key pair using entropy from rand.
// If rand is nil, crypto/rand.Reader will be used.
func (g *Group) GenerateKey(rand io.Reader) (private PrivateKey, public PublicKey, err error) {if g.P == nil {panic("crypto/dh: group prime is nil")}if g.G == nil {panic("crypto/dh: group generator is nil")}if rand == nil {rand = cryptorand.Reader}// Ensure, that p.G ^ privateKey > than g.P// (only modulo calculations are safe)// The minimal (and common) value for p.G is 2// So 2 ^ (1 + 'bitsize of p.G') > than g.Pmin := big.NewInt(int64(g.P.BitLen() + 1)) //生成一个不小于p的大数bytes := make([]byte, (g.P.BitLen()+7)/8)  //bit/8 = byte, +7 是为了补空,放置少除了,然后长度不够for private == nil {_, err = io.ReadFull(rand, bytes)if err != nil {private = nilreturn}// Clear bits in the first byte to increase// the probability that the candidate is < g.P.bytes[0] = 0if private == nil {private = new(big.Int)}(*private).SetBytes(bytes)   //将读到的数据设置进private中if (*private).Cmp(min) < 0 { //private 小于 一个不小于p的数。 如x < y返回-1;如x > y返回+1;否则返回0。private = nil}}public = new(big.Int).Exp(g.G, private, g.P) //x**y mod |m| =  A = g**a mod preturn
}// PublicKey returns the public key corresponding to the given private one.
func (g *Group) PublicKey(private PrivateKey) (public PublicKey) {public = new(big.Int).Exp(g.G, private, g.P)return
}//private returns a non-nil error if the given public key is
// not a possible element of the group. This means, that the
// public key is < 0 or > g.P.
func (g *Group) Check(peersPublic PublicKey) (err error) {if !((*peersPublic).Cmp(zero) >= 0 && (*peersPublic).Cmp(g.P) == -1) {err = errors.New("peer's public is not a possible group element")}return
}// ComputeSecret returns the secret computed from
// the own private and the peer's public key.
func (g *Group) ComputeSecret(private PrivateKey, peersPublic PublicKey) (secret *big.Int) {secret = new(big.Int).Exp(peersPublic, private, g.P)return
}

ECDH

全称是Elliptic Curve Diffie-Hellman, 是DH算法的加强版, 基于椭圆曲线难题加密, 现在是主流的密钥交换算法。

ECC是建立在基于椭圆曲线的离散对数的难度, 大概过程如下:

给定椭圆曲线上的一个点P,一个整数k,求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。ECDH即建立在此数学难题之上
ECDH 和 curve25519 go的实现

引用: 密码学简介与Golang的加密库Crypto的使用

package main
import ("crypto""crypto/elliptic""crypto/rand""fmt""io""math/big""golang.org/x/crypto/curve25519"
)
// ECDH 秘钥交换算法的主接口
type ECDH interface {GenerateKey(io.Reader) (crypto.PrivateKey, crypto.PublicKey, error)Marshal(crypto.PublicKey) []byteUnmarshal([]byte) (crypto.PublicKey, bool)GenerateSharedSecret(crypto.PrivateKey, crypto.PublicKey) ([]byte, error)
}
type ellipticECDH struct {ECDHcurve elliptic.Curve
}
type ellipticPublicKey struct {elliptic.CurveX, Y *big.Int
}
type ellipticPrivateKey struct {D []byte
}
// NewEllipticECDH 指定一种椭圆曲线算法用于创建一个ECDH的实例
// 关于椭圆曲线算法标准库里面实现了4种: 见crypto/elliptic
func NewEllipticECDH(curve elliptic.Curve) ECDH {return &ellipticECDH{curve: curve,}
}
// GenerateKey 基于标准库的NIST椭圆曲线算法生成秘钥对
func (e *ellipticECDH) GenerateKey(rand io.Reader) (crypto.PrivateKey, crypto.PublicKey, error) {var d []bytevar x, y *big.Intvar priv *ellipticPrivateKeyvar pub *ellipticPublicKeyvar err errord, x, y, err = elliptic.GenerateKey(e.curve, rand)if err != nil {return nil, nil, err}priv = &ellipticPrivateKey{D: d,}pub = &ellipticPublicKey{Curve: e.curve,X:     x,Y:     y,}return priv, pub, nil
}
// Marshal用于公钥的序列化
func (e *ellipticECDH) Marshal(p crypto.PublicKey) []byte {pub := p.(*ellipticPublicKey)return elliptic.Marshal(e.curve, pub.X, pub.Y)
}
// Unmarshal用于公钥的反序列化
func (e *ellipticECDH) Unmarshal(data []byte) (crypto.PublicKey, bool) {var key *ellipticPublicKeyvar x, y *big.Intx, y = elliptic.Unmarshal(e.curve, data)if x == nil || y == nil {return key, false}key = &ellipticPublicKey{Curve: e.curve,X:     x,Y:     y,}return key, true
}
// GenerateSharedSecret 通过自己的私钥和对方的公钥协商一个共享密码
func (e *ellipticECDH) GenerateSharedSecret(privKey crypto.PrivateKey, pubKey crypto.PublicKey) ([]byte, error) {priv := privKey.(*ellipticPrivateKey)pub := pubKey.(*ellipticPublicKey)x, _ := e.curve.ScalarMult(pub.X, pub.Y, priv.D)return x.Bytes(), nil
}
// NewCurve25519ECDH 使用密码学家Daniel J. Bernstein的椭圆曲线算法:Curve25519来创建ECDH实例
// 因为Curve25519独立于NIST之外, 没在标准库实现, 需要单独为期实现一套接口来支持ECDH
func NewCurve25519ECDH() ECDH {return &curve25519ECDH{}
}
type curve25519ECDH struct {ECDH
}
// GenerateKey 基于curve25519椭圆曲线算法生成秘钥对
func (e *curve25519ECDH) GenerateKey(rand io.Reader) (crypto.PrivateKey, crypto.PublicKey, error) {var pub, priv [32]bytevar err error_, err = io.ReadFull(rand, priv[:])if err != nil {return nil, nil, err}priv[0] &= 248priv[31] &= 127priv[31] |= 64curve25519.ScalarBaseMult(&pub, &priv)return &priv, &pub, nil
}
// 实现公钥的序列化
func (e *curve25519ECDH) Marshal(p crypto.PublicKey) []byte {pub := p.(*[32]byte)return pub[:]
}
// 实现公钥的反序列化
func (e *curve25519ECDH) Unmarshal(data []byte) (crypto.PublicKey, bool) {var pub [32]byteif len(data) != 32 {return nil, false}copy(pub[:], data)return &pub, true
}
// 实现秘钥协商接口
func (e *curve25519ECDH) GenerateSharedSecret(privKey crypto.PrivateKey, pubKey crypto.PublicKey) ([]byte, error) {var priv, pub, secret *[32]bytepriv = privKey.(*[32]byte)pub = pubKey.(*[32]byte)secret = new([32]byte)curve25519.ScalarMult(secret, priv, pub)return secret[:], nil
}
func test(e ECDH) {var privKey1, privKey2 crypto.PrivateKeyvar pubKey1, pubKey2 crypto.PublicKeyvar pubKey1Buf, pubKey2Buf []bytevar err errorvar ok boolvar secret1, secret2 []byte// 准备2对秘钥对,A: privKey1,pubKey1 B:privKey2,pubKey2privKey1, pubKey1, err = e.GenerateKey(rand.Reader)if err != nil {fmt.Println(err)}privKey2, pubKey2, err = e.GenerateKey(rand.Reader)if err != nil {fmt.Println(err)}pubKey1Buf = e.Marshal(pubKey1)pubKey2Buf = e.Marshal(pubKey2)pubKey1, ok = e.Unmarshal(pubKey1Buf)if !ok {fmt.Println("Unmarshal does not work")}pubKey2, ok = e.Unmarshal(pubKey2Buf)if !ok {fmt.Println("Unmarshal does not work")}// A 通过B给的公钥协商共享密码secret1, err = e.GenerateSharedSecret(privKey1, pubKey2)if err != nil {fmt.Println(err)}// B 通过A给的公钥协商共享密码secret2, err = e.GenerateSharedSecret(privKey2, pubKey1)if err != nil {fmt.Println(err)}// A B在没暴露直接的私钥的情况下, 协商出了一个共享密码fmt.Printf("The secret1 shared keys: %x\n", secret1)fmt.Printf("The secret2 shared keys: %x\n", secret2)
}
func main() {e1 := NewEllipticECDH(elliptic.P521())e2 := NewCurve25519ECDH()test(e1)test(e2)
}

参考

CTF Wiki

Go语言实现AES加密算法(CTR模式)

密码学简介与Golang的加密库Crypto的使用

秘密的实质——密钥

dh go实现

dh 维基百科 迪菲-赫尔曼密钥交换

GO加密解密之RSA

关键字

转载于:https://my.oschina.net/solate/blog/2998295

这篇关于加密解密 CTR IGE DH等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291449

相关文章

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Linux加密框架设计与实现

本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:原文作者是独孤九贱大佬 原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html

Android的登陆MD5加密

1:导入代码 public class MD5Util {private static final String TAG = "MD5Util";/**** MD5加码 生成32位md5码*/public static String string2MD5(String inStr) {Log.e(TAG, "string2MD5: -------------------------");Mess

【C#生态园】解密C# Web框架:选对框架,事半功倍

探秘C# Web开发利器:六款高性能框架与库详细解读 前言 在当今的软件开发领域,C#作为一种多用途编程语言,被广泛应用于各种类型的应用程序开发。特别是在Web开发领域,有许多优秀的C# Web框架和库,本文将对其中一些备受关注的框架进行介绍和比较,帮助读者更好地选择适合其项目需求的工具。 欢迎订阅专栏:C#生态园 文章目录 探秘C# Web开发利器:六款高性能框架与库详细解

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

如何实现加密功能

文章目录 1. 概念介绍2. 方法与功能2.1 基本用法2.2 加密算法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容,本章回中将介绍一个加密工具包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 加密主要是为了保护一些重要数据,我们在实际项目中会用到加密工具,因此在本章回中介绍一个加密工具

详解BitLocker模式及加密数据和解密方法及无法访问解决之道

BitLocker主要有两种工作模式:TPM模式和U盘模式,同时为了实现更高程度的安全,我们还可以同时启用这两种模式。 BitLocker 自动设备加密在全新安装体验 (OOBE) 期间启动。 但是,只有在用户使用 Microsoft 帐户或 Azure Active Directory 帐户登录后,才会启用(提供)保护。 在此之前,保护已暂停,数据不受保护。 使用本地帐户不会启用 BitLoc