1、Java的异或加解密算法
在使用异或加解密时,加密和解密的密钥必须保持相同,否则解密时无法恢复为原来的内容。
[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)); } }2、IOS加解密算法
在使用异或加解密时,加密和解密的密钥必须保持相同,否则解密时无法恢复为原来的内容。如果想在iOS与Java中通用,必须保持Java与IOS中的密钥一致。
1).h文件内容
[objc]
#import <Foundation/Foundation.h> @interface XOREncryptAndDecrypt : NSObject /** * 字符串加密 * * @param plainText 要加密的字符串 * * @return 加密后的字符串 */ + (NSString *)encryptForPlainText:(NSString *)plainText; /** * 解密字符串 * * @param encryption 要解密的字符串 * * @return 要解密的字符串 如果不为加密字符则返回原字符串 */ + (NSString *)decryptForEncryption:(NSString *)encryption; @end2).m文件内容
[objc]
#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转载于:https://www.cnblogs.com/akiha/p/6507011.html
