Java的异或加解密算法
在使用异或加解密时,加密和解密的密钥必须保持相同,否则解密时无法恢复为原来的内容。
public class XOREncryptAndDecrypt {
//密钥 加解密的密钥必须相同 可自定义
private static final String secretKey ="abcdefghijklmnopqrstuvwxyz";
/**
* 字符串加密
* @param plainText 要加密的字符串
* @return 加密后的字符串
*/
public static String encrypt(String plainText){
String encryption = "";
try {
plainText = new String(plainText.getBytes("UTF-8"),"iso-8859-1");
} catch (Exception e) {
}
char[] cipher=new char[plainText.length()];
for(int i=0,j=0;i<plainText.length();i++,j++){
if(j==secretKey.length())
j=0;
cipher[i]=(char) (plainText.charAt(i)^secretKey.charAt(j));
String strCipher= Integer.toHexString(cipher[i]);
if(strCipher.length() == 1){
encryption+="0"+strCipher;
}else{
encryption+=strCipher;
}
}
return encryption;
}
/**
* 解密字符串
* @param encryption 要解密的字符串
* @return 解密后的字符串
*/
public static String decrypt(String encryption) {
char[] decryption=new char[encryption.length()/2];
for(int i=0,j=0;i<encryption.length()/2;i++,j++){
if(j==secretKey.length())
j=0;
char n=(char)(int)Integer.valueOf(encryption.substring(i*2,i*2+2),16);
decryption[i]=(char)(n^secretKey.charAt(j));
}
String decoding="";
try {
decoding = new String(String.valueOf(decryption).getBytes("iso-8859-1"),"UTF-8");
} catch (Exception e) {
}
return decoding;
}
/**
* @param args
*/
public static void main(String[] args) {
String name="你好";
String tem=XOREncryptAndDecrypt.encrypt(name);
System.out.println(tem);
System.out.println(XOREncryptAndDecrypt.decrypt(tem));
}
}
iOS加解密算法
在使用异或加解密时,加密和解密的密钥必须保持相同,否则解密时无法恢复为原来的内容。如果想在IOS与Java中通用,必须保持Java与IOS中的密钥一致。
.h文件内容
#import <Foundation/Foundation.h>
@interface XOREncryptAndDecrypt : NSObject
/**
* 字符串加密
*
* @param plainText 要加密的字符串
*
* @return 加密后的字符串
*/
+ (NSString *)encryptForPlainText:(NSString *)plainText;
/**
* 解密字符串
*
* @param encryption 要解密的字符串
*
* @return 要解密的字符串 如果不为加密字符则返回原字符串
*/
+ (NSString *)decryptForEncryption:(NSString *)encryption;
@end
.m文件内容
#import "XOREncryptAndDecrypt.h"
@implementation XOREncryptAndDecrypt
static NSString *secretKey =@"abcdefghijklmnopqrstuvwxyz"; ///<密钥 加解密的密钥必须相同 可自定义
#pragma mark 加密字符串
+ (NSString *)encryptForPlainText:(NSString *)plainText
{
//保存加密后的字符
NSMutableString *encryption=[NSMutableString string];
//编码转换后的字符串 UTF_8->iso-8859-1
NSString *encoding=[[NSString alloc]initWithData:[plainText dataUsingEncoding:NSUTF8StringEncoding] encoding:NSISOLatin1StringEncoding];
for(int i=0,j=0;i<encoding.length;i++,j++){
if(j==secretKey.length){
j=0;
}
//异或后的字符
char cipher=(char)([encoding characterAtIndex:i]^[secretKey characterAtIndex:j]);
//NSLog(@"%c转成16进制的字符串:%@,%@",cipher,[NSString stringWithFormat:@"%hhx",cipher],[NSString stringWithFormat:@"%x",cipher&0xff]);
//转成16进制形式的字符串 \x8b转成8b字符串
NSString *strCipher= [NSString stringWithFormat:@"%hhx",cipher];
if(strCipher.length == 1){
[encryption appendFormat:@"0%@",strCipher];
}else{
[encryption appendString:strCipher];
}
}
return encryption;
}
#pragma mark 解密 如果不为加密字符则返回原字符
+ (NSString *)decryptForEncryption:(NSString *)encryption {
//保存解密后的字符
NSMutableString *decryption=[NSMutableString string];
//解码字符
NSString *decoding=nil;
for(int i=0,j=0;i<encryption.length/2;i++,j++){
if(j==secretKey.length){
j=0;
}
//截取16进制形式的字符串 \x8b中的8b
NSString *tem=[encryption substringWithRange:NSMakeRange(i*2, 2)];
char *endptr;
//把16进制形式的字符串转为字符
char n=(char)(int)strtoul([tem UTF8String],&endptr,16);
//判断是否为加密字符
if (n=='\0'&&*endptr!='\0') {
[decryption setString:@""];
break;
}
[decryption appendFormat:@"%c",(char)(n^[secretKey characterAtIndex:j])];
}
if (![decryption isEqualToString:@""]) {
//编码后的字符串 iso-8859-1 -> UTF_8
decoding=[[NSString alloc]initWithData:[[decryption copy] dataUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
}
if (decoding==nil) {
decoding=encryption;
}
return decoding;
}
@end