Giter VIP home page Giter VIP logo

golang-module / dongle Goto Github PK

View Code? Open in Web Editor NEW
868.0 868.0 67.0 623 KB

A simple, semantic and developer-friendly golang package for encoding&decoding and encryption&decryption

Home Page: https://pkg.go.dev/github.com/golang-module/dongle

License: MIT License

Go 100.00%
3des aes base16 base32 base45 base58 base62 base64 base85 base91 decoding decryption des encoding encryption hash hmac rsa sm3

dongle's People

Contributors

alonelucky avatar gouguoyin avatar nannul avatar open-git avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dongle's Issues

增加参数校验

Feature Request

AES 加解密的时候,key的长度是有要求的,不然随便一个key可能会有问题,加解密出的结果不对应,可以考虑增加参数校验或则增加错误输出,不然使用者无感知得到一个错误的结果(空字符串)

另外,文档readme中对AES解密的demo是有问题的,应该是 dongle.Decrypt.FromString 而不是 dongle.Encrypt.FromString

Decrypt not handle illegal string error

Hello,

I encountered an issue with the following code:

func Decode(s string) (string, error) {
	cipher := dongle.NewCipher()
	cipher.SetMode(dongle.CBC)      // CBC、CFB、OFB、CTR、ECB
	cipher.SetPadding(dongle.PKCS7) // No、Zero、PKCS5、PKCS7
	cipher.SetKey(c.AUTH_KEY)       // key must be 16, 24 or 32 bytes
	cipher.SetIV(c.IV_KEY)
	e := dongle.Decode.FromString(s).ByBase62()
	if e.Error != nil {
		return "", e.Error
	}
	raw := e.ToBytes()

	f := dongle.Decrypt.FromRawBytes(raw).ByAes(cipher)
	if f.Error != nil {
		return "", f.Error
	}
	return f.ToString(), nil
}

_, mustError := Decode("123")
if mustError != nil {
	fmt.Println(mustError.Error())
}

golang version: 1.19

dongle version: 0.2.0

I expected to get:

Error.Error()

But I actually get:

 (*cbcDecrypter).CryptBlocks: panic("crypto/cipher: input not full blocks")
go/pkg/mod/github.com/golang-module/[email protected]/cipher.go:126 (0xddbec1)

Thanks!

建议增加Benchmark数据

Feature Request

Is your feature request related to a problem? Please describe:

Describe the feature you'd like:

Describe alternatives you've considered:

Teachability, Documentation, Adoption, Migration Strategy:

Recently encountered coding BCD and RSA no padding

Feature Request

  1. Encrypted and encoded as BCD Binary-coded decimal
  2. rsa no padding (unsafe)
// rsa no padding encrypt
func LowerSafeEncrypt(pub *rsa.PublicKey, msg []byte) []byte {
         m := new(big.Int).SetBytes(msg)
	e := big.NewInt(int64(pub.E))
	return new(big.Int).Exp(m, e, pub.N).Bytes()
}

// rsa no padding decrypt
func LowerSafeDecrypt(priv *rsa.PrivateKey, msg []byte) []byte {
        c := new(big.Int).SetBytes(msg)
	return new(big.Int).Exp(c, priv.D, priv.N).Bytes()
}

AES encryption uses CBC or ECB mode, when the padding is PKCS5, the encrypted content is a multiple of 16 and will panic

Hello,

I encountered an issue with the following code:

func TestAESPKCS5(t *testing.T) {
	key := "0123456789abcdef"
	cipher := dongle.NewCipher()
	cipher.SetMode(dongle.CBC)      // CBC、CFB、OFB、CTR、ECB
	cipher.SetPadding(dongle.PKCS5) // No、Zero、PKCS5、PKCS7、AnsiX923、ISO97971
	cipher.SetKey(key)              // key 长度必须是 16、24 或 32 字节
	cipher.SetIV(key)
	data := "0123456789abcdef0123456789abcdef"
	// data的长度是16的倍数会panic: crypto/aes: output not full block
	res := dongle.Encrypt.FromString(data).ByAes(cipher).ToHexString()
	// data的长度不是16的倍数则正常
	//res := dongle.Encrypt.FromString(data[:len(data)-1]).ByAes(cipher).ToHexString()
	println(res)
}

golang version: go version go1.20.5

dongle version: v0.2.8

I expected to get:

PKCS5填充实际调用的是PKCS7,但blockSize固定为8
改成:paddingText := bytes.Repeat([]byte{byte(blockSize)}, 16)就正常了,不太了解填充方式,不知道有没有其他问题

But I actually get:

panic: crypto/cipher: input not full blocks 

Thanks!

openssl_encrypt($str, 'AES-128-ECB', $key, $padding)

The following is the php implementation code

<?php

        $padding = OPENSSL_RAW_DATA;
        $str = "483";
        $key = "1234567890";
        $data = openssl_encrypt($str, 'AES-128-ECB', $key, $padding);
        $data = strtolower(bin2hex($data));
        echo $data;
        echo "\r\n";

        $decrypted = openssl_decrypt(hex2bin($data), 'AES-128-ECB', $key, $padding);
        echo $decrypted;
        echo "\r\n";
?>

output:
13863dbecd8078bf2c8d4a795fe203e4
483

The following is the Go implementation code

func TestDecryptAes(t *testing.T) {
	key := "1234567890"
	cipher := dongle.NewCipher()
	cipher.SetMode(dongle.ECB) // CBC、CFB、OFB、CTR、ECB
	//cipher.SetPadding(dongle.Zero) // No、Zero、PKCS5、PKCS7、AnsiX923、ISO97971
	//key = dongle.Encrypt.FromString(key).ByMd5().String()
	cipher.SetKey(key) // key 长度必须是 16、24 或 32 字节
	//cipher.SetIV("")                                  // iv 长度必须是 16 字节,ECB 模式不需要设置 iv

	str := "13863dbecd8078bf2c8d4a795fe203e4"
	str = dongle.Decrypt.FromHexString(str).ByAes(cipher).ToString()
	println(str)
}

output
Empty string

But I can't decrypt with go. How can I decrypt with go?

Excuse me, the long encrypted content cannot be decrypted because of the length problem. Is there a better solution at present?

感谢提供优秀的功能。

目前有个小疑问,接收到其他较长RSA加密内容(其他人的接口返回,我无法让对方改变长度),无法解密,请问有什么好的方式吗?

比如

官方示例公钥 私钥 进行在线加解密没问题

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAK12MTd84qkCZzp4iLUj8YSUglaFMsFlv9KlIL4+Xts40PK3+wbsXPEw
cujGeUmdgMeZiK7SLLSz8QeE0v7Vs+cGK4Bs4qLtMGCiO6wEuyt10KsafTyBktFn
dk/+gBLr7B/b+9+HaMIIoJUdsFksdAg3cxTSpwVApe98loFNRfqDAgMBAAE=
-----END RSA PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCtdjE3fOKpAmc6eIi1I/GElIJWhTLBZb/SpSC+Pl7bONDyt/sG
7FzxMHLoxnlJnYDHmYiu0iy0s/EHhNL+1bPnBiuAbOKi7TBgojusBLsrddCrGn08
gZLRZ3ZP/oAS6+wf2/vfh2jCCKCVHbBZLHQIN3MU0qcFQKXvfJaBTUX6gwIDAQAB
AoGAFwAfEo56t5JcAcLNzccQVVYj2jkbO820G8hNiSxYA5WLD0QaAxcAU/Lqqbb3
ii1aUB0ppJS13NgnU6nnGGdZzUYBG1Hai6EkVyCGrI4amQ93AaVdKncL8gJ4RZAm
YzPPUwSMEESsu24pS1NF1G1Y8C+28b/Wr0oqOsCvL6PhsMECQQDwsPJJoWRx7ZJw
E1K5KLT0cXKyrIpyXY3I6tyA5imCzOzccf3d1vDgB0L9sdSO7bG3ceSwpAeiWEbg
5jGZemPzAkEAuH6U4pEI4AMbWnatpK55Rc235NDgmT3VyIuRaKC02YXAZ+jznFep
XMd4DTli4R9r3j2YVhUpyDVbdQpFH98DMQJAQpOvcU6DSkA80WOG7lCkPTlkUKgJ
Y7kdDwZoF/+SW+vzWMbvQf3CgzV/Ak2+TgrRrbyDVZkJw45HjM4fyiRgoQJBALH/
/qlxgPyQQs3O/s2KQBsm1auAE5IF5MLuVUZ69sF/mBko2hEXSqHnGV645TuKU0pC
Zz12ga9WO3z6gaK0SaECQQDah1pKt9ViBBy4USXK3OWXEloHuTwmyr9AbLqqI5tQ
2eNuH0NkuJYQmnXmHLbKOELoYocldEBXmkzPXSN+X9kV
-----END RSA PRIVATE KEY-----

使用在线加密 https://the-x.cn/cryptography/Rsa.aspx 加密以下内容

{"resources":[{"url":"/s/d41d8cd98f00b204e9800998ecf8427e-CDN/-agee2g/8703/189cb2l/6996746284aaa1c092b08a6943f0127e/_/download/contextbatch/css/request-access-plugin,-_super/batch.css","resourceType":"CSS","ieOnly":false,"key":"request-access-plugin,-_super","batchType":"context"},{"url":"/s/53f60c417daf99ffbdbb9a3d8dc254c2-CDN/-agee2g/8703/189cb2l/6996746284aaa1c092b08a6943f0127e/_/download/contextbatch/js/request-access-plugin,-_super/batch.js?locale=zh-CN","resourceType":"JAVASCRIPT","ieOnly":false,"key":"request-access-plugin,-_super","batchType":"context"}],"unparsedData":{"com.atlassian.confluence.plugins.confluence-request-access-plugin:confluence-request-access-plugin-resources.mail-server-configured":"true"},"unparsedErrors":{}}

获取加密后的内容为:

C/B9BCapoSqo03jfJzk7QFTuQkWNVYrDioW9/Ud8+O3hj92fmYcNuXABQIjvZBVAtAqmo83uAQzxuE3eIrPe2rBTO06Y4VNK/+Vh7NH1gvpe+FGq+VoQha69S4F7pLk8mcTW2knLmVI8rlPz2C2DT9s+ZXKi6a8xmMs44/ZWCtpQSWmM/tWRdEumt7oj9E/zt+dBO3OKsM/9Am+ht2+UmH9LdfICFKHXG11UWfBwOxeqSUMK6Al3PVviE8JEdkbq6KqJQX0oYNkqmsYI+efStMndnJw9OeJudorHOzQjQtLROrNWyXIhTP/wajPPG3wmsNrKTn1WFLpcfWDQlT1Dt0mQqRP8FjnwNHTLwx1gtB7geLnO2sQFQph6XS1/XzhMV0qOztJKUNlxuOzY27Yst9opDeq0zcAPy+nGxdmWYp1a+8jAipzZ6zYn+pp6lY7MpDgpLdtXrAJDwt7zcdX6Bjwa+hXpJ5+4zSy4t7oo7ze+eqaFp4VR31hDNfWFU+dFTlH9R1g/2f2eOaWKn4yQzd9GNrz9D2MFQ1tx+IhbzZdnV0cGCMHLLk4DYMCmhh9o60RhOZO50CzBNctQlc4498qScwYlg3BQt0xmQDcodcUfsdtYC6EJRB3SsfAjmyNgcaDc9fUinF6uu5BdZIibutYfVsbpaf7haJ4WuzgYAfoRh8LVPm9l9ceM7iS38gLSWPv8IvyAjm6CwYU+KZABeWwaqHDubvdolIWd9GSjPWh9sw+JfA4F8nTbpgf9OegNS4hQUFvbR0NGg/R9/WoB4lTPOf2KSgdlxSzZtpSETvND1GrwI4So3XYa0t+MZBtBSnEwxQKwbiWhzPy4kM6s5S01XfrcpMIA9joVK8yhtQAH1FAZLHm+jIcQ1urhQ2CWvDWmsJZhL6KYL2GSi3q7XhgbMf3AT6Rpr0tDwsVOjkSnbxuobtpneGqCaj8w36Ixl+cy9ETH4q4P3bW6XjbnNzQbz6M94B4WvXnqA2YWJ+77SpEdIBZjJE3g4/9UjlgsGfi4grLnzIpuL7gX9RjGrhEqaDsAq+ip7pAkWXLNIoTdwzZ0RYGHThLEL8n6Pp3W/6swt83hv2lvsXLYRxdwlHiyOPATWHSE0SLtmQxpAIXpR/+DK5+Cvb+6npbJlGuB505ArlmlSvedFCSEHepEWgabnTohI5ab6Qr4/YxXhBQ=

再通过私钥在线解密也没问题。

这种的无法直接使用dongle解密。 我用dart的 crypton 可以直接解密。dongle 还有什么好的方式吗?

帮忙看看,go install 安装报错

您好,

我在 Win10 执行安装命令:

go install github.com/golang-module/dongle@latest

golang version: v1.19.4

dongle version: v0.2.1

安装命令输出报错:

go: downloading github.com/golang-module/dongle v0.2.1
go: downloading golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898
package github.com/golang-module/dongle is not a main package

帮忙看看这个应该怎么解决?

谢谢!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.