AES 加密算法 跨语言

aes加密算法

delphi 、java、c# 、网页在线工具 4个相同

AES/ECB/PKCS5Padding

与网页在线工具加密结果相同

http://tool.chacuo.net/cryptblowfish

package tt;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class aesNoRandom {
    /**
     * 加密
     *
     * @param content 需要加密的内容
     * @param password  加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {
            try {
                    /*KeyGenerator kgen = KeyGenerator.getInstance("AES");
                    kgen.init(128, new SecureRandom(password.getBytes()));
                    SecretKey secretKey = kgen.generateKey();
                    byte[] enCodeFormat = secretKey.getEncoded();
                    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");*/
                    SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
                    Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                    byte[] byteContent = content.getBytes("utf-8");
                    cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
                    byte[] result = cipher.doFinal(byteContent);
                    return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
            } catch (InvalidKeyException e) {
                    e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
            } catch (BadPaddingException e) {
                    e.printStackTrace();
            }
            return null;
    }  

    /**解密
     * @param content  待解密内容
     * @param password 解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {
            try {
                     /*KeyGenerator kgen = KeyGenerator.getInstance("AES");
                     kgen.init(128, new SecureRandom(password.getBytes()));
                     SecretKey secretKey = kgen.generateKey();
                     byte[] enCodeFormat = secretKey.getEncoded();
                     SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");*/
                     SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
                     Cipher cipher = Cipher.getInstance("AES");// 创建密码器
                    cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
                    byte[] result = cipher.doFinal(content);
                    return result; // 加密
            } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                    e.printStackTrace();
            } catch (InvalidKeyException e) {
                    e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                    e.printStackTrace();
            } catch (BadPaddingException e) {
                    e.printStackTrace();
            }
            return null;
    }
}
package tt;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

import sun.misc.*;

import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
import javax.crypto.SecretKey;

import com.sun.java_cup.internal.runtime.virtual_parse_stack;

import tw2.CrytographicTool.CryptoAlgorithm;

public class jm {

    private static  String keyString="1234567890123456";

    /**将二进制转换成16进制
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < buf.length; i++) {
                    String hex = Integer.toHexString(buf[i] & 0xFF);
                    if (hex.length() == 1) {
                            hex = ‘0‘ + hex;
                    }
                    sb.append(hex.toUpperCase());
            }
            return sb.toString();
    }  

    /**
     * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
     * hexStr2ByteArr(String strIn) 互为可逆的转换过程
     *
     * @param arrB
     *            需要转换的byte数组
     * @return 转换后的字符串
     * @throws Exception
     *             本方法不处理任何异常,所有异常全部抛出
     */
    public static String byteArr2HexStr(byte[] arrB) {
        int iLen = arrB.length;
        // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
        StringBuffer sb = new StringBuffer(iLen * 2);
        for (int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            // 把负数转换为正数
            while (intTmp < 0) {
                intTmp = intTmp + 256;
            }
            // 小于0F的数需要在前面补0
            if (intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    /**将16进制转换为二进制
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
            if (hexStr.length() < 1)
                    return null;
            byte[] result = new byte[hexStr.length()/2];
            for (int i = 0;i< hexStr.length()/2; i++) {
                    int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
                    int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
                    result[i] = (byte) (high * 16 + low);
            }
            return result;
    }
    public static void  outBytes(byte[] abs) {
        for (int i = 0; i < abs.length; i++)
         System.out.printf("%d,", abs[i]);
        System.out.println();
    }

    public static String  myEncrypt(String plainText) throws UnsupportedEncodingException
    {
        String b64,cipherText,s16;
        byte [] bs;
        BASE64Encoder base64Encoder;

        base64Encoder = new BASE64Encoder();

        bs = plainText.getBytes("utf-8");
        b64=base64Encoder.encode(bs);

        System.out.println(b64);

        bs= aesNoRandom.encrypt(b64,keyString);

        cipherText = base64Encoder.encode(bs);       

        cipherText=cipherText.replaceAll("\r\n", "");

        return cipherText;

    }
    public static String  myDecrypt(String cipherText) throws IOException
    {
        String b64,plainText,str16;
        byte [] bs;
        BASE64Decoder base64Decoder;

        base64Decoder = new BASE64Decoder();

        bs=base64Decoder.decodeBuffer(cipherText);              

        bs= aesNoRandom.decrypt(bs, keyString);

        str16 = new String(bs,"utf-8");

        bs = base64Decoder.decodeBuffer(str16);

        plainText = new String(bs,"utf-8");

        return plainText;
    }

    public static void main(String arg[]) {

        System.out.println("encrypt testing");

        try {

            byte[] bs = null;
            String cipherText = "243434";
            String b64 = "";
            String s16=null;
            String astr;
            BASE64Encoder base64Encoder;

            String plainTextString="";
            String plainTextBlowfishString="blowfish";
            String keyString="12345678901234567890123456789012";
            String keyString16="1234567890123456";
            String keyString8="12345678";
            byte[] keyBytes=null;
            String encryptString, decryptString;

             Scanner sc=new Scanner(System.in);
             System.out.print("请输入符:");
             plainTextString=sc.nextLine();

            cipherText= zbEncrypt(plainTextString);
            System.out.println(cipherText);

            plainTextString = "";
            plainTextString=zbDecrypt(cipherText);
            System.out.println(plainTextString);

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

}

c#版本

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;

namespace WindowsFormsApplication3
{
    class enAES
    {

        public static string Encrypt(string toEncrypt,PaddingMode mypadmode,string keystring,CipherMode acmode)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(keystring);
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.BlockSize = 128;
            rDel.KeySize = 128;
            rDel.Key = keyArray;

            rDel.Mode = acmode;
            rDel.Padding = mypadmode;

            ICryptoTransform cTransform = rDel.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        public static string Decrypt(string toDecrypt, PaddingMode mypadmode, string keystring, CipherMode acmode)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(keystring);
            byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

            RijndaelManaged rdel = new RijndaelManaged();
            rdel.KeySize = 128;
            rdel.BlockSize = 128;

            rdel.Key = keyArray;

            rdel.Mode = acmode;
            rdel.Padding = mypadmode;

            ICryptoTransform ctrans = rdel.CreateDecryptor();
            byte[] result = ctrans.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return UTF8Encoding.UTF8.GetString(result);

        }
    }
}

AES class

   private void button1_Click(object sender, EventArgs e)
        {
            byte[] bsPlain = Encoding.Default.GetBytes("blowfish");
            byte[] key = Convert.FromBase64String("Y2xvc2V3YnE=");

            PaddingMode aPadmode=PaddingMode.PKCS7;
            if (this.listBox1.SelectedIndex == 0)
                aPadmode = PaddingMode.None;
            else if (this.listBox1.SelectedIndex == 1)
                aPadmode = PaddingMode.PKCS7;
            else if (this.listBox1.SelectedIndex == 2)
                aPadmode = PaddingMode.Zeros;
            else if (this.listBox1.SelectedIndex == 3)
                aPadmode = PaddingMode.ANSIX923;
            else if (this.listBox1.SelectedIndex == 4)
                aPadmode = PaddingMode.ISO10126;

            CipherMode acmode = CipherMode.ECB;

            if (this.listBox2.SelectedIndex == 0)
                acmode = CipherMode.CBC;
            else if (this.listBox2.SelectedIndex == 1)
                acmode = CipherMode.ECB;
            else if (this.listBox2.SelectedIndex == 2)
                acmode = CipherMode.OFB;
            else if (this.listBox2.SelectedIndex == 3)
                acmode = CipherMode.CFB;
            else if (this.listBox2.SelectedIndex == 4)
                acmode = CipherMode.CTS;

            try
            {
                this.textBox2.Text = enAES.Encrypt(this.textBox1.Text, aPadmode, this.textBox4.Text, acmode);

                this.textBox3.Text = enAES.Decrypt(this.textBox2.Text, aPadmode, this.textBox4.Text, acmode);
            }
            catch (Exception)
            {

                this.textBox3.Text = "not support padding mode";
            }

        }

form

时间: 2024-12-19 08:51:10

AES 加密算法 跨语言的相关文章

AES 加密算法的原理详解

AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的).对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 下面简单介绍下各个部分的作用与意义: 明文P 没有经过加密的数据. 密钥K 用来加密明文的密码,在对称

AES加密算法C代码分析

0.引言 对于加密算法的软件实现,通常已经有很多的成熟的库可供选择,只需要根据自己的要求进行选择即可相应的库即可(有的可能需要进行些许修改).这里选择的是C语言实现的一个开源密码库mbedTLS,mbedTLS由XySSL发展而来,后改为PolarSSL,PolarSSL被ARM公司收购后改成了mbedTLS,主要用于物联网等安全嵌入式领域.mbedTLS实现了常见的分组加密算法.hash算法.RSA以及ECC公钥密码体制,一个适用于嵌入式的SSL协议以及X509证书等,基本能够满足大部分的嵌入

PHP android ios相互兼容的AES加密算法

APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ANDROID IOS,相互加解密正常的AES加密算法代码. PHP的AES加密算法: [codesyntax lang=”php”] <?php class MCrypt { private $hex_iv = '00000000000000000000000000000000'; # conve

基于Thrift的跨语言、高可用、高性能、轻量级的RPC框架

功能介绍 跨语言通信 方便的使Java.Python.C++三种程序可以相互通信 负载均衡和容灾处理 方便的实现任务的分布式处理 支持服务的水平扩展,自动发现新的服务节点 能够兼容各种异常情况,如节点的异常down机 可视化管理 通过服务管理系统可以方便查看服务状态和统计信息 与原生thrift通信 支持与原生thrift服务进行通信 与业内方案的对比 与thrift.avro.hessian相比,harpc支持了高可用,并且更加易用 与dubbo相比,harpc支持了跨语言,并且更轻量级 与i

atitit.跨语言执行cmd&#160;cli&#160;api的原理及兼容性设计草案

atitit.跨语言执行cmd cli api的原理及兼容性设计草案 1. 标准输入,标准输出,标准错误与重新定向1 2. 常见问题2 2.1. 执行bat文件2 2.2. 执行bat文件  /c  与/k   /k  参数,有利于调试2 2.3. Bat参数的隐藏命令::使用@后头符2 2.4. 空格的问题 双引号解决2 2.5. 回显乱码 cmd win默认是gbk编码..使用gbk编码读取佐ok2 2.6.  双引号转译问题2 2.7. Name param的问题2 3. Java cod

汉高澳大利亚sinox接口捆绑经典winxp,全面支持unicode跨语言处理

用qtconfig(或者qtconfig-qt4)设置字体后,汉澳sinox视窗界面以跟winxp媲美的界面出现,爽心悦目. 并且视窗使用非常稳定.非常少出现死机无响应现象,堪称完美. 引入unicode编码.实现跨语言的文本处理和转换,也就是说对世界上存在的各种语言处理没有问题,包含藏文,彝文等. 汉澳sinox视窗默认启动unicode编码.实现了汉澳sinox最初设计目标,支持多国语言同一时候处理,输入法也没有问题. Unicode是国际组织制定的能够容纳世界上全部文字和符号的字符编码方案

做一个分布式、跨语言、跨平台、敏捷 需要那些技术做支撑?

做了7年的开发了,时间越久越是发现自己需要一个像标题写的那样的一个架构做为整个平台的支撑. 我的技术种类又是.net开发,总觉得.net技术人才容易出现瓶颈:其实这种瓶颈更像是这种环境造成的.简单快捷的开发本来就是.net所追求的,而这种追求导致整个语言平台在技术上都喜欢用最直接简单的方法解决问题,至于架构,可维护,持续升级,还是等项目上线或是出了问题之后再说.成熟.稳健并被公认的技术架构似乎每个做技术的都是见仁见智,都有自己独立的理解,而像java一样ssh等成熟公认的架构在业界基本寥寥无几,

Apache Thrift 跨语言服务开发框架

Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 IDL 来定义 RPC 的接口和数据类型,然后通过代码生成工具来生成针对不同编程语言的代码,目前支持 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCa

Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要哪些组件的支持? 四.如何安装? 五.Golang.Java.Python.PHP之间通过Thrift实现跨语言调用 1) Golang 客户端和服务端的实现及交互 2) python 客户端的实现与golang 服务端的交互 3) php 客户端的实现与golang 服务端的交互 4) java