关键词加密算法实现的主要思路:
1、给定一个关键词;
2、去除关键词中的重复字母;
3、生成密码簿;
4、根据字母的序列,将明文字母替换成密文字母;
5、拼接密文字母,输出加密之后的密文。
新建一个文件,命名为:KeywordEncrypt,添加如下代码:
1、KeywordEncrypt.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface KeywordEncrypt : NSObject
@property (nonatomic, copy) NSString *encryptString;
@property (nonatomic, copy) NSString *passwordBook;
- (instancetype)initKeyword:(NSString *)keyword originString:(NSString *)originString;
@end
NS_ASSUME_NONNULL_END
2、KeywordEncrypt.m
#define OLD_PASSWORD_BOOK @"abcdefghijklmnopqrstuvwxyz"
#import "KeywordEncrypt.h"
@interface KeywordEncrypt ()
@end
@implementation KeywordEncrypt
- (instancetype)initKeyword:(NSString *)keyword originString:(NSString *)originString
{
KeywordEncrypt *encrypt = [[KeywordEncrypt alloc] init];
encrypt.encryptString = [self appendEncryptLetterWithKeyword:keyword originString:originString];
encrypt.passwordBook = [self getNewPasswordBook:keyword];
return encrypt;
}
//加密
- (NSString *)appendEncryptLetterWithKeyword:(NSString *)keyword originString:(NSString *)originString
{
NSMutableArray *orderArr = [self locationOriginString:originString];
NSMutableArray *newPasswordBook = [self generatePasswordBook:[self checkKeyword:keyword]];
NSString *result = @"";
for (NSInteger i=0; i<orderArr.count; i++) {
NSInteger index = [orderArr[i] integerValue];
result = [result stringByAppendingString:newPasswordBook[index]];
}
return result;
}
//找出明文字符串中每个字母在字母表中对应的位置
- (NSMutableArray *)locationOriginString:(NSString *)string
{
NSMutableArray *mutaArr = [[NSMutableArray alloc] init];
NSMutableArray *letterArr = [[NSMutableArray alloc] init];
for (NSInteger i=0; i<string.length; i++) {
[mutaArr addObject:[string substringWithRange:NSMakeRange(i, 1)]];
}
for (NSUInteger i=0; i<mutaArr.count; i++) {
NSString *letter = mutaArr[i];
NSInteger location = [self locationLetter:letter];
[letterArr addObject:[NSNumber numberWithInteger:location]];
}
return letterArr;
}
//找出某个明文字母在字母表中的位置
- (NSInteger)locationLetter:(NSString *)letter
{
NSMutableArray *oldPasswordBook = [self originPasswordBook];
for (NSInteger i=0; i<oldPasswordBook.count; i++) {
if ([oldPasswordBook[i] isEqualToString:letter]) {
return i;
}
}
return 0;
}
//去除关键字种重复的字母
- (NSString *)checkKeyword:(NSString *)keyword
{
NSMutableArray *mutaArr = [[NSMutableArray alloc] init];
for (NSInteger i=0; i<keyword.length; i++) {
NSString *charStr = [keyword substringWithRange:NSMakeRange(i, 1)];
if (![mutaArr containsObject:charStr]) {
[mutaArr addObject:charStr];
}
}
NSString *newKeyword = @"";
for (NSString *charStr in mutaArr) {
newKeyword = [newKeyword stringByAppendingString:charStr];
}
return newKeyword;
}
//原始的密码薄
- (NSMutableArray *)originPasswordBook
{
NSMutableArray *mutaArr = [[NSMutableArray alloc] init];
for (NSInteger i=0; i<OLD_PASSWORD_BOOK.length; i++) {
[mutaArr addObject:[OLD_PASSWORD_BOOK substringWithRange:NSMakeRange(i, 1)]];
}
return mutaArr;
}
//生成新的密码薄
- (NSMutableArray *)generatePasswordBook:(NSString *)keyword
{
NSMutableArray *keyWordArr = [[NSMutableArray alloc] init];
for (NSInteger i=0; i<keyword.length; i++) {
NSString *letter = [keyword substringWithRange:NSMakeRange(i, 1)];
if (![keyWordArr containsObject:letter]) {
[keyWordArr addObject:letter];
}
}
NSMutableArray *oldPasswordBook = [self originPasswordBook];
NSMutableArray *newPasswordArr = [[NSMutableArray alloc] init];
for (NSInteger i=0; i<oldPasswordBook.count; i++) {
if (![keyWordArr containsObject:oldPasswordBook[i]]) {
keyword = [keyword stringByAppendingString:oldPasswordBook[i]];
}
}
for (NSInteger i=0; i<keyword.length; i++) {
NSString *charStr = [keyword substringWithRange:NSMakeRange(i, 1)];
[newPasswordArr addObject:charStr];
}
return newPasswordArr;
}
//获取新的密码簿
- (NSString *)getNewPasswordBook:(NSString *)keyword
{
NSString *passwordBook = @"";
for (NSString *str in [self generatePasswordBook:keyword]) {
passwordBook = [NSString stringWithFormat:@"%@ %@",passwordBook, str];
}
return passwordBook;
}
@end
3、效果图