目录
前言
由于最近项目中用到base58加密解,所以就顺便记录一下了。如有错误请留言指教。
本文是参考js的实现方式转换过来的。如有冒犯,请原谅。
base58在线转换工具
base58原理、编码表
Base58加密原理:和通常base64编码一样,base58编码的作用也是将非可视字符可视化(ASCII化)。但不同的是base58编码去掉了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ,和几个影响双击选择的字符,如/, +。结果字符集正好58个字符(包括9个数字,24个大写字母,25个小写字母)。
定义字符集
@property (nonatomic, strong) NSString *ALPHABET;
@property (nonatomic, strong) NSMutableDictionary *ALPHABET_MAP;
// 先存ALPHABET_MAP(方便后期检查当前是否为Base58编码)
self.ALPHABET = @"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
self.ALPHABET_MAP = [NSMutableDictionary dictionary];
for(int i = 0; i< [self.ALPHABET length]; i++) {
NSString *temp = [self.ALPHABET substringWithRange:NSMakeRange(i,1)];
[self.ALPHABET_MAP addEntriesFromDictionary:@{
temp: @(i) }];
}
//NSLog(@"%@", self.ALPHABET_MAP);
// 得到对象ALPHABET_MAP ---> {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, A: 9, B: 10, C: 11, D: 12, E: 13, …, y: 56, z: 57}
[self base58Encode:@"aa真棒66"];
[self base58Decode:@"6UKrcvVZK6GzQM"];
加密
#pragma mark - 加密
// base58加密, 传入加密后的字符串
- (NSString *)base58Encode:(NSString *)string {
if (string.length == 0) {
return @"";
}
NSArray *byteArr = [self UTF8ArrayWithString:string]; // aa真棒66 ==> [97, 97, 231, 156, 159, 230, 163, 146, 54, 54]
if (byteArr.count <= 0) {
return @"";
}
int BASE = 58;
NSMutableArray *digits = [@[@(0)] mutableCopy];
for (int i = 0; i < byteArr.count; i++) {
for (int j = 0; j < digits.count; j++) {
// 将数据转为二进制,再位运算右边添8个0,得到的数转二进制
// 位运算-->相当于 digits[j].toString(2);parseInt(10011100000000,2)
digits[j] = @([digits[j] intValue] << 8);
}
digits[0] = @([digits[0] intValue] + [byteArr[i