173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

安卓aes加密键盘

keros@mark 2022-11-08 资讯中心

今天给各位分享安卓aes加密键盘的知识,如果能碰巧解决你现在面临的问题,别忘了关注本站。

本文目录一览

Android在用aes加密字符串之后再用base64加密,加密的结果跟ios端不一样,

之前在项目上用到aes256加密解密算法,刚开始在java端加密解密都没有问题,在iOS端加密解密也没有问题。但是奇怪的是在java端加密后的文件在iOS端无法正确解密打开,然后简单测试了一下,发现在java端和iOS端采用相同明文,相同密钥加密后的密文不一样!上网查了资料后发现iOS中aes加密算法采用的填充是PKCS7Padding,而java不支持PKCS7Padding,只支持PKCS5Padding。我们知道加密算法由算法+模式+填充组成,所以这两者不同的填充算法导致相同明文相同密钥加密后出现密文不一致的情况。那么我们需要在java中用PKCS7Padding来填充,这样就可以和iOS端填充算法一致了。

要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现,下面我会提供该包的下载。啰嗦了一大堆,下面是一个简单的测试,上代码!

001 package com.encrypt.file;

002

003

004 import java.io.UnsupportedEncodingException;

005 importjava.security.Key;

006 import java.security.Security;

007

008 importjavax.crypto.Cipher;

009 importjavax.crypto.SecretKey;

010 importjavax.crypto.spec.SecretKeySpec;

011

012 public classaes256Encryption{

013

014 /**

015 * 密钥算法

016 * java6支持56位密钥,bouncycastle支持64位

017 * */

018 public static finalString KEY_ALGORITHM="aes";

019

020 /**

021 * 加密/解密算法/工作模式/填充方式

022 *

023 * JAVA6 支持PKCS5PADDING填充方式

024 * Bouncy castle支持PKCS7Padding填充方式

025 * */

026 public static finalString CIPHER_ALGORITHM="aes/ECB/PKCS7Padding";

027

028 /**

029 *

030 * 生成密钥,java6只支持56位密钥,bouncycastle支持64位密钥

031 * @return byte[] 二进制密钥

032 * */

033 public static byte[] initkey() throwsException{

034

035 // //实例化密钥生成器

036 // Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

037 // KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM, "BC");

038 // //初始化密钥生成器,aes要求密钥长度为128位、192位、256位

039 //// kg.init(256);

040 // kg.init(128);

041 // //生成密钥

042 // SecretKey secretKey=kg.generateKey();

043 // //获取二进制密钥编码形式

044 // return secretKey.getEncoded();

045 //为了便于测试,这里我把key写死了,如果大家需要自动生成,可用上面注释掉的代码

046 return new byte[] { 0x08, 0x08, 0x04, 0x0b, 0x02, 0x0f, 0x0b, 0x0c,

047 0x01, 0x03, 0x09, 0x07, 0x0c, 0x03, 0x07, 0x0a, 0x04, 0x0f,

048 0x06, 0x0f, 0x0e, 0x09, 0x05, 0x01, 0x0a, 0x0a, 0x01, 0x09,

049 0x06, 0x07, 0x09, 0x0d };

050 }

051

052 /**

053 * 转换密钥

054 * @param key 二进制密钥

055 * @return Key 密钥

056 * */

057 public static Key toKey(byte[] key) throwsException{

058 //实例化DES密钥

059 //生成密钥

060 SecretKey secretKey=newSecretKeySpec(key,KEY_ALGORITHM);

061 returnsecretKey;

062 }

063

064 /**

065 * 加密数据

066 * @param data 待加密数据

067 * @param key 密钥

068 * @return byte[] 加密后的数据

069 * */

070 public static byte[] encrypt(byte[] data,byte[] key) throwsException{

071 //还原密钥

072 Key k=toKey(key);

073 /**

074 * 实例化

075 * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现

076 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")

077 */

078 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

079 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM, "BC");

080 //初始化,设置为加密模式

081 cipher.init(Cipher.ENCRYPT_MODE, k);

082 //执行操作

083 returncipher.doFinal(data);

084 }

085 /**

086 * 解密数据

087 * @param data 待解密数据

088 * @param key 密钥

089 * @return byte[] 解密后的数据

090 * */

091 public static byte[] decrypt(byte[] data,byte[] key) throwsException{

092 //欢迎密钥

093 Key k =toKey(key);

094 /**

095 * 实例化

096 * 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现

097 * Cipher.getInstance(CIPHER_ALGORITHM,"BC")

098 */

099 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);

100 //初始化,设置为解密模式

101 cipher.init(Cipher.DECRYPT_MODE, k);

102 //执行操作

103 returncipher.doFinal(data);

104 }

105 /**

106 * @param args

107 * @throws UnsupportedEncodingException

108 * @throws Exception

109 */

110 public static void main(String[] args) throwsUnsupportedEncodingException{

111

112 String str="aes";

113 System.out.println("原文:"+str);

114

115 //初始化密钥

116 byte[] key;

117 try {

118 key = aes256Encryption.initkey();

119 System.out.print("密钥:");

120 for(int i = 0;ikey.length;i++){

121 System.out.printf("%x", key[i]);

122 }

123 System.out.print("\n");

124 //加密数据

125 byte[] data=aes256Encryption.encrypt(str.getBytes(), key);

126 System.out.print("加密后:");

127 for(int i = 0;idata.length;i++){

128 System.out.printf("%x", data[i]);

129 }

130 System.out.print("\n");

131

132 //解密数据

133 data=aes256Encryption.decrypt(data, key);

134 System.out.println("解密后:"+newString(data));

135 } catch (Exception e) {

136 // TODO Auto-generated catch block

137 e.printStackTrace();

138 }

139

140 }

141 }

运行程序后的结果截图:

ViewController.m文件

01 //

02 // ViewController.m

03 // aes256EncryptionDemo

04 //

05 // Created by 孙 裔 on 12-12-13.

06 // Copyright (c) 2012年 rich sun. All rights reserved.

07 //

08

09 #import "ViewController.h"

10 #import "EncryptAndDecrypt.h"

11

12 @interface ViewController ()

13

14 @end

15

16 @implementation ViewController

17 @synthesize plainTextField;

18 - (void)viewDidLoad

19 {

20 [super viewDidLoad];

21 // Do any additional setup after loading the view, typically from a nib.

22 }

23

24 - (void)didReceiveMemoryWarning

25 {

26 [super didReceiveMemoryWarning];

27 // Dispose of any resources that can be recreated.

28 }

29 //这个函数实现了用户输入完后点击视图背景,关闭键盘

30 - (IBAction)backgroundTap:(id)sender{

31 [plainTextField resignFirstResponder];

32 }

33

34 - (IBAction)encrypt:(id)sender {

35

36 NSString *plainText = plainTextField.text;//明文

37 NSData *plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];

38

39 //为了测试,这里先把密钥写死

40 Byte keyByte[] = {0x08,0x08,0x04,0x0b,0x02,0x0f,0x0b,0x0c,0x01,0x03,0x09,0x07,0x0c,0x03,

41 0x07,0x0a,0x04,0x0f,0x06,0x0f,0x0e,0x09,0x05,0x01,0x0a,0x0a,0x01,0x09,

42 0x06,0x07,0x09,0x0d};

43 //byte转换为NSData类型,以便下边加密方法的调用

44 NSData *keyData = [[NSData alloc] initWithBytes:keyByte length:32];

45 //

46 NSData *cipherTextData = [plainTextData aes256EncryptWithKey:keyData];

47 Byte *plainTextByte = (Byte *)[cipherTextData bytes];

48 for(int i=0;i[cipherTextData length];i++){

49 printf("%x",plainTextByte[i]);

50 }

51

52 }

53 @end

求解释这段安卓代码中的aes加密流程

aes加密过程涉及到 4 种操作,分别是字节替代、行移位、列混淆和轮密钥加。

1.字节替换:字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

2.行移位:行移位的功能是实现一个4x4矩阵内部字节之间的置换。

4.轮密钥加:加密过程中,每轮的输入与轮密钥异或一次(当前分组和扩展密钥的一部分进行按位异或);因为二进制数连续异或一个数结果是不变的,所以在解密时再异或上该轮的密钥即可恢复输入。

5.密钥扩展:其复杂性是确保算法安全性的重要部分。当分组长度和密钥长度都是128位时,aes的加密算法共迭代10轮,需要10个子密钥。aes的密钥扩展的目的是将输入的128位密钥扩展成11个128位的子密钥。aes的密钥扩展算法是以字为一个基本单位(一个字为4个字节),刚好是密钥矩阵的一列。因此4个字(128位)密钥需要扩展成11个子密钥,共44个字。

我手机是华为牌子-我上wf路由器上显示安卓手机

第一种情况当然就是输入的密码不正确啦,只要重新输入正确的密码自然就可以了链接上网络了!具体做法是打开wlan界面——长按无线网的ssid——修改网络——重新输入密码就可以,如果还不行的话就直接长按无线网的ssid——取消保存网络,然后搜索网络,重新输入密码就可以啦! 第二种情况就是由于你所在的附近,有多近?隔壁寝室、楼上楼下等等,你们用的路由器太多,发射功率大小不一样,而路由器出厂默认的信道都是6,导致相互干扰,从而导致身份验证出现问题!解决方法当然是改路由器信道了!具体是浏览器输入192.168.1.1回车进入——无线设置——基本设置——信道,下拉菜单改就可以了! 第三种情况就是密码正确,但是还是显示身份验证出现问题,这种一般来说可能是输入法的问题,我们最好使用安卓系统的原生输入法输入密码,并且注意大小写!具体切换方式手机设置——语言和输入法——选择安卓键盘就行了! 第四种情况可能是手机加密方式和路由的无线网络密码的加密方式不同,一般用WPA-PSK/WPA2-PSK,加密方式用aes,主要是安全,破解难度大,多试试加密方式也可以解决。

aes加密 在PC上和Android上不一样 怎么解决

你没有指定RNG的Provider

未指定的情况下 Android 2.3以上版本使用的是 随机数序列是 Android's OpenSSL-backed security provider

以下版本是 BouncyCastle Security Provider

JDK 1.7内没有这个Provider, 这个Android自己搞的,你服务端一定解不出来的。

目前Android支持的 RNG有以下几种

Android's OpenSSL-backed security provider 1ASN.1, DER, PkiPath, PKCS7

BouncyCastle Security Provider v1.49 HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature) Harmony JSSE Provider Android KeyStore security provider

服务端如果也没指定的话,默认使用的是

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)

Oracle JDK 1.7 环境下 支持以下

SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)

Sun RSA signature provider

Sun Elliptic Curve provider (EC, ECDSA, ECDH)

Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)

SunJCE Provider (implements RSA, DES, Triple DES, aes, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)

Sun (Kerberos v5, SPNEGO)

Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)

XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)

Sun PC/SC provider

Sun's Microsoft Crypto API provider

你们服务端要是用的 什么 OPENJDK 第三方虚拟机,php什么的话,那就只有天知道支不支持了。

不过你看也知道了 JDK里的都是SUN自己搞的, Android JVM里挂载的不是Android专用的就是第三方开源的,我估计你是找不到一样的 随机数生成器 方案了

智能化时代的到来涉及了各种核心算法,保护算法就能保障开发者权益,杜绝市面上各种山寨品,加密芯片恰好能起到很好的保护作用,如何选择加密芯片呢?KEROS加密芯片专注于加密领域十余年,行业首选。
1.安全性:采用国际通用aes256算法加密并同时通过KAS传送,除基本认证之外,利用2K安全EEPROM,用户可以自己管理密钥和数据,实现双重保护。
2.唯一性:以定制的方式为每一位用户单独定制“专属型号CID”,多用户之间算法不兼容,并且采用固化的方法直接将算法固化到晶圆上而无需烧入。
3.序列号:每颗芯片制造生产时具有5字节全球唯一SN序列号,每颗芯片SN都不会重复。
4.防抄特性:每颗芯片都有自己独特的密钥系统,破解单颗芯片只对这颗芯片对应的产品有效,对整个同类型的产品是无效的,依旧无法通过验证。而且KEROS采用ASIC方法设计,芯片内为纯逻辑电路,封装内有40多层逻辑电路整合了10万多个逻辑门,爆力刨片破解难度可想而知。
5.安全存储:用户可以将保密数据加密之后安全的存放到EEPROM中。安卓aes加密键盘的介绍就聊到这里吧,感谢你花时间阅读本站内容。

产品列表
产品封装
友情链接