「双轨加密java」双轨加密法

博主:adminadmin 2023-01-09 09:48:06 763

本篇文章给大家谈谈双轨加密java,以及双轨加密法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何使用java对密码加密 加密方式aes

Java有相关的实现类:具体原理如下

对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。分组之后将分别对每个128位的明文分组进行加密。

对于每个128位长度的明文分组的加密过程如下:

(1)将128位AES明文分组放入状态矩阵中。

(2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。

(3)10轮循环:AES对状态矩阵进行了10轮类似的子加密过程。前9轮子加密过程中,每一轮子加密过程包括4种不同的变换,而最后一轮只有3种变换,前9轮的子加密步骤如下:

● SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;

● ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;

● MixColumns变换:MixColumns变换对状态矩阵的列进行变换;

● AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作。

最后一轮的子加密步骤如下:

● SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;

● ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;

● AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作;

(4)经过10轮循环的状态矩阵中的内容就是加密后的密文。

AES的加密算法的伪代码如下。

在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的膨胀后的密钥,这44个字的膨胀后的密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。

三.AES的分组过程

对于任意长度的明文,AES首先对其进行分组,分组的方法与DES相同,即对长度不足的明文分组后面补充0即可,只是每一组的长度为128位。

AES的密钥长度有128比特,192比特和256比特三种标准,其他长度的密钥并没有列入到AES联邦标准中,在下面的介绍中,我们将以128位密钥为例。

四.状态矩阵

状态矩阵是一个4行、4列的字节矩阵,所谓字节矩阵就是指矩阵中的每个元素都是一个1字节长度的数据。我们将状态矩阵记为State,State中的元素记为Sij,表示状态矩阵中第i行第j列的元素。128比特的明文分组按字节分成16块,第一块记为“块0”,第二块记为“块1”,依此类推,最后一块记为“块15”,然后将这16块明文数据放入到状态矩阵中,将这16块明文数据放入到状态矩阵中的方法如图2-2-1所示。

块0

块4

块8

块12

块1

块5

块9

块13

块2

块6

块10

块14

块3

块7

块11

块15

图2-2-1 将明文块放入状态矩阵中

五.AddRoundKey变换

状态矩阵生成以后,首先要进行AddRoundKey变换,AddRoundKey变换将状态矩阵与膨胀后的密钥进行按位异或运算,如下所示。

其中,c表示列数,数组W为膨胀后的密钥,round为加密轮数,Nb为状态矩阵的列数。

它的过程如图2-2-2所示。

图2-2-2 AES算法AddRoundKey变换

六.10轮循环

经过AddRoundKey的状态矩阵要继续进行10轮类似的子加密过程。前9轮子加密过程中,每一轮要经过4种不同的变换,即SubBytes变换、ShiftRows变换、MixColumns变换和AddRoundKey变换,而最后一轮只有3种变换,即SubBytes变换、ShiftRows变换和AddRoundKey变换。AddRoundKey变换已经讨论过,下面分别讨论余下的三种变换。

1.SubBytes变换

SubBytes是一个独立作用于状态字节的非线性变换,它由以下两个步骤组成:

(1)在GF(28)域,求乘法的逆运算,即对于α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。

(2)在GF(28)域做变换,变换使用矩阵乘法,如下所示:

由于所有的运算都在GF(28)域上进行,所以最后的结果都在GF(28)上。若g∈GF(28)是GF(28)的本原元素,则对于α∈GF(28),α≠0,则存在

β ∈ GF(28),使得:

β = gαmod(x8 + x4 + x3 + x + 1)

由于g255 = 1mod(x8 + x4 + x3 + x + 1)

所以g255-α = β-1mod(x8 + x4 + x3 + x + 1)

根据SubBytes变换算法,可以得出SubBytes的置换表,如表2-2-1所示,这个表也叫做AES的S盒。该表的使用方法如下:状态矩阵中每个元素都要经过该表替换,每个元素为8比特,前4比特决定了行号,后4比特决定了列号,例如求SubBytes(0C)查表的0行C列得FE。

表2-2-1 AES的SubBytes置换表

它的变换过程如图2-2-3所示。

图2-2-3 SubBytes变换

AES加密过程需要用到一些数学基础,其中包括GF(2)域上的多项式、GF(28)域上的多项式的计算和矩阵乘法运算等,有兴趣的同学请参考相关的数学书籍。

2.ShiftRows变换

ShiftRows变换比较简单,状态矩阵的第1行不发生改变,第2行循环左移1字节,第3行循环左移2字节,第4行循环左移3字节。ShiftRows变换的过程如图2-2-4所示。

图2-2-4 AES的ShiftRows变换

3.MixColumns变换

在MixColumns变换中,状态矩阵的列看作是域GF(28)的多项式,模(x4+1)乘以c(x)的结果:

c(x)=(03)x3+(01)x2+(01)x+(02)

这里(03)为十六进制表示,依此类推。c(x)与x4+1互质,故存在逆:

d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)•d(x) = (D1)mod(x4+1)。

设有:

它的过程如图2-2-5所示。

图2-2-5 AES算法MixColumns变换

七.密钥膨胀

在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,膨胀后的密钥记为子密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的子密钥,这44个字的子密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。

密钥膨胀算法是以字为基础的(一个字由4个字节组成,即32比特)。128比特的原始密钥经过膨胀后将产生44个字的子密钥,我们将这44个密钥保存在一个字数组中,记为W[44]。128比特的原始密钥分成16份,存放在一个字节的数组:Key[0],Key[1]……Key[15]中。

在密钥膨胀算法中,Rcon是一个10个字的数组,在数组中保存着算法定义的常数,分别为:

Rcon[0] = 0x01000000

Rcon[1] = 0x02000000

Rcon[2] = 0x04000000

Rcon[3] = 0x08000000

Rcon[4] = 0x10000000

Rcon[5] = 0x20000000

Rcon[6] = 0x40000000

Rcon[7] = 0x80000000

Rcon[8] = 0x1b000000

Rcon[9] = 0x36000000

另外,在密钥膨胀中包括其他两个操作RotWord和SubWord,下面对这两个操作做说明:

RotWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3进行循环移位,即

RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 )

SubWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3使用AES的S盒,即

SubWord( B0,B1,B2,B3 ) = ( B’0,B’1,B’2,B’3 )

其中,B’i = SubBytes(Bi),i = 0,1,2,3。

密钥膨胀的算法如下:

八.解密过程

AES的加密和解密过程并不相同,首先密文按128位分组,分组方法和加密时的分组方法相同,然后进行轮变换。

AES的解密过程可以看成是加密过程的逆过程,它也由10轮循环组成,每一轮循环包括四个变换分别为InvShiftRows变换、InvSubBytes变换、InvMixColumns变换和AddRoundKey变换;

这个过程可以描述为如下代码片段所示:

九.InvShiftRows变换

InvShiftRows变换是ShiftRows变换的逆过程,十分简单,指定InvShiftRows的变换如下。

Sr,(c+shift(r,Nb))modNb= Sr,c for 0 r 4 and 0 ≤ c Nb

图2-2-6演示了这个过程。

图2-2-6 AES算法InvShiftRows变换

十.InvSubBytes变换

InvSubBytes变换是SubBytes变换的逆变换,利用AES的S盒的逆作字节置换,表2-2-2为InvSubBytes变换的置换表。

表2-2-2 InvSubBytes置换表

十一.InvMixColumns变换

InvMixColumns变换与MixColumns变换类似,每列乘以d(x)

d(x) = (OB)x3 + (0D)x2 + (0G)x + (0E)

下列等式成立:

( (03)x3 + (01)x2 + (01)x + (02) )⊙d(x) = (01)

上面的内容可以描述为以下的矩阵乘法:

十二.AddRoundKey变换

AES解密过程的AddRoundKey变换与加密过程中的AddRoundKey变换一样,都是按位与子密钥做异或操作。解密过程的密钥膨胀算法也与加密的密钥膨胀算法相同。最后状态矩阵中的数据就是明文。

java项目如何加密?

Java基本的单向加密算法:

1.BASE64 严格地说,属于编码格式,而非加密算法

2.MD5(Message Digest algorithm 5,信息摘要算法)

3.SHA(Secure Hash Algorithm,安全散列算法)

4.HMAC(Hash Message Authentication Code,散列消息鉴别码)

按 照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)

常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

MD5

MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都 是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文 件是否一致的。

HMAC

HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个 标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证 等。

JAVA文件加密

哈哈!不会是老师留给你的作业吧!在网上做牛!

VERSION 4.00

Begin VB.Form Form1

Caption = "Sample"

ClientHeight = 705

ClientLeft = 3915

ClientTop = 3315

ClientWidth = 1800

ControlBox = 0 'False

Height = 1110

Left = 3855

LinkTopic = "Form1"

MaxButton = 0 'False

MinButton = 0 'False

ScaleHeight = 705

ScaleWidth = 1800

Top = 2970

Width = 1920

Begin VB.CommandButton Command1

Caption = "Command1"

Height = 495

Left = 240

TabIndex = 0

Top = 120

Width = 1215

End

End

Attribute VB_Name = "Form1"

Attribute VB_Creatable = False

Attribute VB_Exposed = False

Sub FileEncodeAndDecode(InputFile As String, OutputFile As String, PasswordKey As String)

Dim temp As Single

Dim Char As String * 1

Dim XORMask As Single

Dim temp1 As Integer

Open InputFile For Binary As #1

Open OutputFile For Binary As #2

For x = 1 To Len(PasswordKey)

temp = Asc(Mid$(PasswordKey, x, 1))

For y = 1 To temp

temp1 = Rnd

Next y

' Re-seed to throw off prying eyes

Randomize temp1

Next x

Counter = 0

For z = 1 To FileLen(InputFile)

'Generate random mask

XORMask = Int(Rnd * 256)

'Get the char change it

Get 1, , Char

Char = Chr$((Asc(Char) Xor XORMask))

Put 2, , Char

Counter = Counter + 1

If Counter Len(PasswordKey) Then Counter = 1

' Pull random numbers from the hat

For x = 1 To (Asc(Mid$(PasswordKey, Counter, 1)) * 2)

temp = Rnd

Next x

Next z

Close #1

Close #2

End Sub

Private Sub Command1_Click()

Dim InputFile As String

Dim OutputFile As String

Dim PasswordKey As String

InputFile = InputBox("Enter a filename to encode")

OutputFile = InputBox("Enter the new filename this will become ")

PasswordKey = InputBox("Enter the password (key)")

Call FileEncodeAndDecode(InputFile, OutputFile, PasswordKey)

MsgBox "File written to " + OutputFile

End

End Sub

Private Sub Form_Load()

Command1.Caption = "Code/Decode"

End Sub

Form=enc-dec.frm

Reference=*\G{BEF6E001-A874-101A-8BBA-00AA00300CAB}#2.0#0#D:\WINDOWS\SYSTEM\OLEPRO32.DLL#Standard OLE Types

Reference=*\G{00025E01-0000-0000-C000-000000000046}#3.0#0#D:\PROGRAM FILES\COMMON FILES\MICROSOFT SHARED\DD:\PROGRAM FIL#Microsoft DAO 3.0 Object Library

ProjWinSize=113,438,221,107

ProjWinShow=2

Name="Project1"

HelpContextID="0"

StartMode=0

VersionCompatible32="0"

MajorVer=1

MinorVer=0

RevisionVer=0

AutoIncrementVer=0

ServerSupportFiles=0

VersionCompanyName="Southern Cross Software"

漫谈Java加密技术(二)

接下来我们介绍对称加密算法 最常用的莫过于DES数据加密算法

DES

DES Data Encryption Standard 即数据加密算法 是IBM公司于 年研究成功并公开发表的 DES算法的入口参数有三个 Key Data Mode 其中Key为 个字节共 位 是DES算法的工作密钥 Data也为 个字节 位 是要被加密或被解密的数据 Mode为DES的工作方式 有两种 加密或解密

DES算法把 位的明文输入块变为 位的密文输出块 它所使用的密钥也是 位

通过java代码实现如下

import java security Key;   import java security SecureRandom;     import javax crypto Cipher;   import javax crypto KeyGenerator;   import javax crypto SecretKey;   import javax crypto SecretKeyFactory;   import javax crypto spec DESKeySpec;       /** *//**   * DES安全编码组件  author by ; *    * pre   * 支持 DES DESede(TripleDES 就是 DES) AES Blowfish RC RC (ARCFOUR)   * DES                  key size must be equal to     * DESede(TripleDES)    key size must be equal to   or     * AES                  key size must be equal to     or  but   and   bits may not be available   * Blowfish             key size must be multiple of   and can only range from   to   (inclusive)   * RC                   key size must be beeen   and   bits   * RC (ARCFOUR)         key size must be beeen   and   bits   * 具体内容 需要关注 JDK Document///docs/technotes/guides/security/l   * /pre   *    * @author 梁栋   * @version     * @since     */  public abstract class DESCoder extends Coder {       /** *//**       * ALGORITHM 算法 br       * 可替换为以下任意一种算法 同时key值的size相应改变        *        * pre       * DES                  key size must be equal to         * DESede(TripleDES)    key size must be equal to   or         * AES                  key size must be equal to     or  but   and   bits may not be available       * Blowfish             key size must be multiple of   and can only range from   to   (inclusive)       * RC                   key size must be beeen   and   bits       * RC (ARCFOUR)         key size must be beeen   and   bits       * /pre       *        * 在Key toKey(byte[] key)方法中使用下述代码       * codeSecretKey secretKey = new SecretKeySpec(key  ALGORITHM);/code 替换       * code       * DESKeySpec dks = new DESKeySpec(key);       * SecretKeyFactory keyFactory = SecretKeyFactory getInstance(ALGORITHM);       * SecretKey secretKey = keyFactory generateSecret(dks);       * /code       */      public static final String ALGORITHM =  DES ;         /** *//**       * 转换密钥br       *        * @param key       * @return       * @throws Exception       */      private static Key toKey(byte[] key) throws Exception {           DESKeySpec dks = new DESKeySpec(key);           SecretKeyFactory keyFactory = SecretKeyFactory getInstance(ALGORITHM);           SecretKey secretKey = keyFactory generateSecret(dks);             // 当使用其他对称加密算法时 如AES Blowfish等算法时 用下述代码替换上述三行代码           // SecretKey secretKey = new SecretKeySpec(key  ALGORITHM);             return secretKey;       }         /** *//**       * 解密       *        * @param data       * @param key       * @return       * @throws Exception       */      public static byte[] decrypt(byte[] data  String key) throws Exception {           Key k = toKey(decryptBASE (key));             Cipher cipher = Cipher getInstance(ALGORITHM);           cipher init(Cipher DECRYPT_MODE  k);             return cipher doFinal(data);       }         /** *//**       * 加密       *        * @param data       * @param key       * @return       * @throws Exception       */      public static byte[] encrypt(byte[] data  String key) throws Exception {           Key k = toKey(decryptBASE (key));           Cipher cipher = Cipher getInstance(ALGORITHM);           cipher init(Cipher ENCRYPT_MODE  k);             return cipher doFinal(data);       }         /** *//**       * 生成密钥       *        * @return       * @throws Exception       */      public static String initKey() throws Exception {           return initKey(null);       }         /** *//**       * 生成密钥       *        * @param seed       * @return       * @throws Exception       */      public static String initKey(String seed) throws Exception {           SecureRandom secureRandom = null;             if (seed != null) {               secureRandom = new SecureRandom(decryptBASE (seed));           } else {               secureRandom = new SecureRandom();           }             KeyGenerator kg = KeyGenerator getInstance(ALGORITHM);           kg init(secureRandom);             SecretKey secretKey = kg generateKey();             return encryptBASE (secretKey getEncoded());       }   }

延续上一个类的实现 我们通过MD 以及SHA对字符串加密生成密钥 这是比较常见的密钥生成方式

再给出一个测试类

import static  junit Assert *;     import  junit Test;     /** *//**   *    * @author by ;; * @version     * @since     */  public class DESCoderTest {         @Test      public void test() throws Exception {           String inputStr =  DES ;           String key = DESCoder initKey();           System err println( 原文:\t  + inputStr);             System err println( 密钥:\t  + key);             byte[] inputData = inputStr getBytes();           inputData = DESCoder encrypt(inputData  key);             System err println( 加密后:\t  + DESCoder encryptBASE (inputData));             byte[] outputData = DESCoder decrypt(inputData  key);           String outputStr = new String(outputData);             System err println( 解密后:\t  + outputStr);             assertEquals(inputStr  outputStr);       }   }

得到的输出内容如下

原文 DES

密钥 f wEtRrV q =

加密后     C qe oNIzRY=

解密后     DES

由控制台得到的输出 我们能够比对加密 解密后结果一致 这是一种简单的加密解密方式 只有一个密钥

其实DES有很多同胞兄弟 如DESede(TripleDES) AES Blowfish RC RC (ARCFOUR) 这里就不过多阐述了 大同小异 只要换掉ALGORITHM换成对应的值 同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key ALGORITHM) 就可以了 此外就是密钥长度不同了

/**

lishixinzhi/Article/program/Java/gj/201311/27624

java加密的几种方式

朋友你好,很高兴为你作答。

首先,Java加密能够应对的风险包括以下几个:

1、核心技术窃取

2、核心业务破解

3、通信模块破解

4、API接口暴露

本人正在使用几维安全Java加密方式,很不错,向你推荐,希望能够帮助到你。

几维安全Java2C针对DEX文件进行加密保护,将DEX文件中标记的Java代码翻译为C代码,编译成加固后的SO文件。默认情况只加密activity中的onCreate函数,如果开发者想加密其它类和方法,只需对相关类或函数添加标记代码,在APK加密时会自动对标记的代码进行加密处理。

与传统的APP加固方案相比,不涉及到自定义修改DEX文件的加载方式,所以其兼容性非常好;其次Java函数被完全转化为C函数,直接在Native层执行,不存在Java层解密执行的步骤,其性能和执行效率更优。

如果操作上有不明白的地方,可以联系技术支持人员帮你完成Java加密。

希望以上解答能够帮助到你。

参考资料,点这里----java加密方式:网页链接

怎样把两个java加密解密程序连在一起实现两种加密功能!

1.

可以横向加密,即对同一个明码进行分别加密,验证时需要验证两个密文分别解密后是否同时成立;

2.

可以纵向加密,先使用其中一个加密程序对明文加密,得到密文1;再用另一个程序对密文1再次加密,解密则反之。

双轨加密java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于双轨加密法、双轨加密java的信息别忘了在本站进行查找喔。