首页 > 编程语言 >Golang 实现Java的AES ECB 加密

Golang 实现Java的AES ECB 加密

时间:2024-05-24 15:40:51浏览次数:20  
标签:src AES Java ECB blockSize cipher func return byte

Java

    public static String encryptAesEcb(String target, String sKey) throws Exception {
        byte[] raw = sKey.getBytes("UTF-8");
        //  "AES" 就是用 AES/ECB/PKCS5Padding
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(target.getBytes());
        return byteTurnHex(encrypted);
    }

		// 转16进制字符
    private static String byteTurnHex(byte[] b) {
        StringBuilder hs = new StringBuilder();
        String stmp;
        for (int n = 0; b != null && n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0XFF);
            if (stmp.length() == 1) {
                hs.append('0');
            }
            hs.append(stmp);
        }
        return hs.toString().toLowerCase();
    }

golang 实现

func main() {
	// 方法1: 自行实现
	encrypt1()
	// 方法2: 使用别人写的包, go get github.com/forgoer/openssl
  // openssl 包还实现了AES其他几种加密方式
	encrypt2()
}

func encrypt1() {
	src := "实现加密过程"
	key := "0234567890123450"
	crypted := encryptService.AesEncrypt(src, key)
	fmt.Println(string(crypted))

	de := encryptService.AesDecrypt(crypted, []byte(key))
	fmt.Println(string(de))

	d := encryptService.ByteToHex(crypted)
	fmt.Println(d)
}

// 这个方法是可行的,实现对方java加密的
func encrypt2() {
	src := []byte("实现加密过程")
	key := []byte("0234567890123450")
	dst, err := openssl.AesECBEncrypt(src, key, openssl.PKCS5_PADDING)
	d := encryptService.ByteToHex(dst)
	fmt.Println(d, err)
	return
}

encryptService.go 的内容,转载自:https://blog.csdn.net/zhizhengguan/article/details/89281336 :

/*
*
AES/ECB/PKCS5 加密解密
*/
package encryptService

import (
	"bytes"
	"crypto/aes"
	"crypto/cipher"
	"fmt"
	"strings"
)

func ByteToHex(b []byte) string {
	var sb strings.Builder
	for _, v := range b {
		sb.WriteString(fmt.Sprintf("%02x", v))
	}
	return sb.String()
}

func AesDecrypt(crypted, key []byte) []byte {
	block, err := aes.NewCipher(key)
	if err != nil {
		fmt.Println("err is:", err)
	}
	blockMode := NewECBDecrypter(block)
	origData := make([]byte, len(crypted))
	blockMode.CryptBlocks(origData, crypted)
	origData = PKCS5UnPadding(origData)
	return origData
}

func AesEncrypt(src, key string) []byte {
	block, err := aes.NewCipher([]byte(key))
	if err != nil {
		fmt.Println("key error1", err)
	}
	if src == "" {
		fmt.Println("plain content empty")
	}
	ecb := NewECBEncrypter(block)
	content := []byte(src)
	content = PKCS5Padding(content, block.BlockSize())
	crypted := make([]byte, len(content))
	ecb.CryptBlocks(crypted, content)
	return crypted
}

func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
	padding := blockSize - len(ciphertext)%blockSize
	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(ciphertext, padtext...)
}

func PKCS5UnPadding(origData []byte) []byte {
	length := len(origData)
	// 去掉最后一个字节 unpadding 次
	unpadding := int(origData[length-1])
	return origData[:(length - unpadding)]
}

type ecb struct {
	b         cipher.Block
	blockSize int
}

func newECB(b cipher.Block) *ecb {
	return &ecb{
		b:         b,
		blockSize: b.BlockSize(),
	}
}

type ecbEncrypter ecb

// NewECBEncrypter returns a BlockMode which encrypts in electronic code book
// mode, using the given Block.
func NewECBEncrypter(b cipher.Block) cipher.BlockMode {
	return (*ecbEncrypter)(newECB(b))
}
func (x *ecbEncrypter) BlockSize() int { return x.blockSize }
func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
	if len(src)%x.blockSize != 0 {
		panic("crypto/cipher: input not full blocks")
	}
	if len(dst) < len(src) {
		panic("crypto/cipher: output smaller than input")
	}
	for len(src) > 0 {
		x.b.Encrypt(dst, src[:x.blockSize])
		src = src[x.blockSize:]
		dst = dst[x.blockSize:]
	}
}

type ecbDecrypter ecb

// NewECBDecrypter returns a BlockMode which decrypts in electronic code book
// mode, using the given Block.
func NewECBDecrypter(b cipher.Block) cipher.BlockMode {
	return (*ecbDecrypter)(newECB(b))
}
func (x *ecbDecrypter) BlockSize() int { return x.blockSize }
func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
	if len(src)%x.blockSize != 0 {
		panic("crypto/cipher: input not full blocks")
	}
	if len(dst) < len(src) {
		panic("crypto/cipher: output smaller than input")
	}
	for len(src) > 0 {
		x.b.Decrypt(dst, src[:x.blockSize])
		src = src[x.blockSize:]
		dst = dst[x.blockSize:]
	}
}

标签:src,AES,Java,ECB,blockSize,cipher,func,return,byte
From: https://www.cnblogs.com/jing1024/p/18211093

相关文章

  • Java JUC&多线程 基础完整版
    JavaJUC&多线程基础完整版目录JavaJUC&多线程基础完整版1、多线程的第一种启动方式之继承Thread类2、多线程的第二种启动方式之实现Runnable接口3、多线程的第三种实现方式之实现Callable接口4、多线的常用成员方法5、线程的优先级6、守护线程7、线程的让出8、线程插队9、同......
  • JavaScript基本语法
    JavaScript是一种高级的、解释型的编程语言。它是Web开发中不可或缺的一部分,通常用于创建交互式网页,给用户带来更丰富的体验。以下是JavaScript入门的一些基本步骤和概念:1.基本语法变量声明:使用let或const声明变量。letmessage='Hello,World!';constPI=3.14;数......
  • JAVA——接口
                               前言:接口是一种规范和标准,它是一些方法特征的集合,但无具体的实现细节。接口可以被类或其他接口实现,通过面向接口的编程,可以提高代码的复用率、可维护性、可扩展性。1.接口概念在现实......
  • Java并发编程之newFixedThreadPool线程池
    随着计算机硬件性能的不断提升,多核CPU的普及,现代计算机系统的性能越来越强大。在这样的环境下,如何更好地利用计算机系统的性能优势,提高程序的运行效率,是每一个Java开发者需要思考的问题。Java中提供了多线程编程的支持,但是在多线程编程中,线程的创建、启动、调度等都需要耗费一定的......
  • java Long 与long转换
    https://blog.51cto.com/u_16213451/7032984概述在Java中,Long是一个包装类,是long的封装类型。Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换。本文将详细介绍如何在Java中实现Long和long之间的转换。流程以下是将Long和long相互转换的流程:步骤描述......
  • Java基于saas模式云MES制造执行系统源码Spring Boot + Hibernate Validation什么是MES
    Java基于saas模式云MES制造执行系统源码SpringBoot+HibernateValidation什么是MES系统?MES制造执行系统,通过互联网技术实现从订单下达到产品完成的整个生产过程进行优化管理。能有效地对生产现场的流程进行智能控制,防错防呆防漏,自动化集成各种制造信息,使管理者准确掌控工......
  • Java 9的模块化系统(JPMS):探讨Java 9引入的模块化系统,并解释其对Java生态的影响
    Java9模块化系统(JPMS)简介Java9模块系统,也被称为Java平台模块系统(JPMS),它是Java9的核心特性之一,用于改进Java的大型应用的封装性和可维护性。 JPMS的主要功能如下: 模块化代码:JPMS允许你将代码库划分为不同的模块,在没有显示声明的情况下,模块内部的类......
  • Java异常处理:共享在设计和实现Java异常处理策略时的最佳实践
    一、概览Java异常处理的最佳实践通常包括以下几个方面:有效使用Java提供的异常类型,创建和使用自定义异常,异常链,异常处理策略,以及记录和传播异常。二、有效使用Java提供的异常类型检查异常(CheckedException):这些异常是在编译阶段就会被检查的异常,通常是预期内的问题......
  • JavaScript 动态网页实例 —— 简单的表单验证
            表单验证是网页设计、特别是网站设计中必不可少的内容,狭义的验证指“用户是否进行了输入”、“输入的数据类型或格式是否符合要求”等,而广义的验证则包括口令确认与身份验证等内容。本章和下一章对表单验证的方式、方法进行介绍,本章只介绍一些简单的验证,包括:......
  • JAVA计算机毕业设计基于SpringBoot的疫苗接种管理系统(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着全球范围内新冠疫情的爆发和持续,疫苗接种成为了防控疫情的重要手段。然而,疫苗接种的管理涉及到众多的环节和人员,如何有效地管理和跟踪接种者的接......