密码学:关键词加密算法的实现

关键词加密算法实现的主要思路:
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、效果图

猜你喜欢

转载自blog.csdn.net/u010545480/article/details/91371961
今日推荐