「双轨加密java」双轨加密法
本篇文章给大家谈谈双轨加密java,以及双轨加密法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、如何使用java对密码加密 加密方式aes
- 2、java项目如何加密?
- 3、JAVA文件加密
- 4、漫谈Java加密技术(二)
- 5、java加密的几种方式
- 6、怎样把两个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的信息别忘了在本站进行查找喔。