반응형

2-1. SMC(System Management Controller) 재설정

SMC는 전원이나 방열 팬, 백라이트 및 부팅 등 맥 전원 체계와 시스템에 연결된 각종 외부 장치들을 총제적으로 관리하는 칩입니다. 다음과 같은 문제가 발생할 경우 SMC를 초기화하는 것으로 효과를 볼 수 있습니다.

• 배터리 관련 이상 증상
• 배터리 인디케이터 오작동
• 디스플레이 밝기 관련 이상 증상
• 키보드 백라이트 관련 이상 증상
• 시스템 팬 관련 이상 증상
• 전원 버튼 오작동
• 잠자기 관련 이상 증상
• 외부 전원(USB, FireWire등) 관련 이상 증상
• 외부 장치(USB HDD등) 관련 이상 증상
• 외부 모니터 인식 문제
• 에어포트 및 블루투스 관련 이상 증상
• 급작스럽게 시스템 전원이 나가는 증상
• SMS(하드 충격 방지 시스템) 오작동

2-2. SMC 재설정 방법

• 포터블 맥(배터리를 탈착할 수 있는 구형 맥북 모델)

1. (맥이 켜져 있는 상태라면) 맥을 종료시킵니다.
2. 전원 케이블을 맥에서 연결 해제합니다.
3. 배터리를 제거합니다.
4. 전원 버튼을 5초간 눌러준 후 손을 땝니다.
5. 배터리를 다시 장착하고 전원 어댑터를 연결합니다.
6. 전원 버튼을 누르고 OS X을 부팅해 줍니다.

• 포터블 맥(배터리를 탈착할 수 없는 맥북 모델)

1. (맥이 켜져 있는 상태라면) 맥을 종료시킵니다.
2. (전원 케이블이 분리되어 있는 상태라면) 전원 케이블을 연결해 줍니다. (배터리 탈착가능한 모델과 반대입니다.)
3. 내장 키보드의 왼쪽 shift + control + option + 전원 버튼을 동시에 눌러줍니다.
4. 마찬가지로 동시에 위 키들에서 손가락을 땝니다.
5. 전원 버튼을 눌러 맥을 시동시킵니다.

• 데스크탑 맥(아이맥, 맥미니, 맥 프로 등)

1. (맥이 켜져 있는 상태라면) 맥을 종료시킵니다.
2.
전원 플러그를 뽑아 줍니다.
3. 15
대기합니다.
4.
전원을 다시 연결합니다.
5. 5
동안 기다렸다 전원 버튼을 눌러 컴퓨터의 전원을 켭니다.

 

2020/07/11 - [OS/Mac OS X] - NVRAM(PRAM) 재설정 방법

2020/07/11 - [iOS/Swift] - Dictionary sort

2020/07/11 - [iOS/Swift] - UTC시간, Locale시간 변경

2020/07/11 - [분류 전체보기] - SEED 블록암호 알고리즘 CBC (Cipher Block Chaining) 예제2

2020/07/11 - [Android/Java] - Webview에서 새로운창 출력

2020/07/11 - [Android/Tips] - Could not find com.android.tools.build:aapt2:4.0.0-6051327.

2020/07/11 - [Android/Kotlin] - byte array to hex string

2020/07/11 - [Android/Tips] - Android API Level 및 명칭

2020/07/11 - [Android/Tips] - ERROR: Could not get unknown property 'com' for root project 'myApp' of type org.gradle.api.Project

2020/07/11 - [Android/Tips] - error: cannot find symbol this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

2020/07/11 - [Android/Rooting] - LG 펌웨어 추출 및 OS 다운그레이드 (kdz file)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (4/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (3/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (2/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (1/4)

반응형

'개발 > Note' 카테고리의 다른 글

모바일 앱 메모리덤프 이슈 해결방법  (0) 2020.12.08
Android, iOS 앱 설치여부 체크 및 스토어 이동  (0) 2020.12.08
NVRAM(PRAM) 재설정 방법  (0) 2020.07.11
duplicate symbol 에러 해결  (0) 2020.06.16
Luhn 알고리즘  (0) 2020.06.02
블로그 이미지

SKY STORY

,
반응형

NVRAM/PRAM을 리셋하는 방법은 2016년 맥북프로를 제외한 모든 기종이 동일합니다. 맥이 완전히 꺼져 있는 상태에서 command + option + p + r 키를 먼저 누른 상태에서 전원 버튼'을 누르고 있으세요. 부팅이 한 번 됐다 다시 자동으로 리부팅 됩니다. 그리고 재부팅 직후 누르고 있던 키에서 손을 땝니다.

 

MacBook Pro (Late 2016) 모델에서 NVRAM을 재설정하는 방법

2016 신형 맥북프로의 경우 시동음이 들리지 않기 때문에 NVRAM을 재설정하는 방법이 조금 다릅니다.

앞서 출시된 다른 맥북은 전원을 켠 뒤 시동음이 들리면 command + option + p + r 키를 길게 누르는 방법으로 NVRAM을 초기화할 수 있습니다. 하지만 시동음이 들리지 않는 2016 맥북프로는 전원을 켠 직 후 command + option + p + r 키를 누르고 20초간 손가락을 떼지 않아야 한다고 합니다. 터치바 탑재 여부와 상관없이 2016년 출시된 모든 맥북프로에 공통으로 적용되는 사항입니다.



2020/07/11 - [OS/Mac OS X] - SMC(System Management Controller) 재설정

2020/07/11 - [iOS/Swift] - Dictionary sort

2020/07/11 - [iOS/Swift] - UTC시간, Locale시간 변경

2020/07/11 - [분류 전체보기] - SEED 블록암호 알고리즘 CBC (Cipher Block Chaining) 예제2

2020/07/11 - [Android/Java] - Webview에서 새로운창 출력

2020/07/11 - [Android/Tips] - Could not find com.android.tools.build:aapt2:4.0.0-6051327.

2020/07/11 - [Android/Kotlin] - byte array to hex string

2020/07/11 - [Android/Tips] - Android API Level 및 명칭

2020/07/11 - [Android/Tips] - ERROR: Could not get unknown property 'com' for root project 'myApp' of type org.gradle.api.Project

2020/07/11 - [Android/Tips] - error: cannot find symbol this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

2020/07/11 - [Android/Rooting] - LG 펌웨어 추출 및 OS 다운그레이드 (kdz file)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (4/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (3/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (2/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (1/4)

2020/06/16 - [OS/Mac OS X] - duplicate symbol 에러 해결

반응형

'개발 > Note' 카테고리의 다른 글

Android, iOS 앱 설치여부 체크 및 스토어 이동  (0) 2020.12.08
SMC(System Management Controller) 재설정  (0) 2020.07.11
duplicate symbol 에러 해결  (0) 2020.06.16
Luhn 알고리즘  (0) 2020.06.02
NFC Xcode 설정  (0) 2020.05.29
블로그 이미지

SKY STORY

,

Dictionary sort

개발/iOS 2020. 7. 11. 21:06
반응형
반응형
블로그 이미지

SKY STORY

,
반응형
// UTC 시간을 Locale 시간으로 변환
func utcToLocale(utcDate : String, dateFormat: String) -> String
{
	let dfFormat = DateFormatter()
	dfFormat.dateFormat = dateFormat
	dfFormat.timeZone = TimeZone(abbreviation: "UTC")
	let dtUtcDate = dfFormat.date(from: utcDate)
	
	dfFormat.timeZone = TimeZone.current
	dfFormat.dateFormat = dateFormat
	return dfFormat.string(from: dtUtcDate!)
}
    
// Locale 시간을 UTC 시간으로 변환
func localeToUtc(localeDate: String, dateFormat: String) -> String
{
	let dfFormat = DateFormatter()
	dfFormat.dateFormat = dateFormat
	dfFormat.timeZone = TimeZone.current
	let dtLocaleDate = dfFormat.date(from: localeDate)
	
	dfFormat.timeZone = TimeZone(abbreviation: "UTC")
	dfFormat.dateFormat = dateFormat
	return dfFormat.string(from: dtLocaleDate!)
}
반응형
블로그 이미지

SKY STORY

,
반응형

최근 SEED 블록 암호 알고리즘 CBC 암복호화 처리를

해야할 일이 생겨 관련 클래스를 제작하게 되었습니다

혹시 같은 작업을 하시는분에게 도움이 되었으면 합니다.

아래 작업은 Swift프로젝트에서 작업되었습니다.

 

SEED 블록암호 알고리즘

seed.kisa.or.kr/kisa/Board/17/detailView.do

 

KISA 암호이용활성화 - 암호알고리즘 소스코드

한국인터넷진흥원(KISA)에서는 128비트 블록암호 SEED를 쉽게 활용할 수 있도록, ECB, CBC, CTR, CCM, GCM, CMAC 운영모드에 대한 소스코드를 배포하고 있습니다. 언어 : C/C++, Java, ASP, JSP, PHP  다음글 2019-01-3

seed.kisa.or.kr

 

KISA_SEED_CBC.h

다음 함수를 헤더에 선언해 주도록 한다.

extern int encryptSeedCBC( IN BYTE *pbszUserKey, IN BYTE *pbszIV, IN BYTE *pbszPlainText, OUT BYTE *pbszCipherText );
extern int decryptSeedCBC( IN BYTE *pbszUserKey, IN BYTE *pbszIV, IN BYTE *pbszCipherText, OUT BYTE *pbszPlainText );

 

KISA_SEED_CBC.c

다음과 같이 작성해 준다.

작성에 앞서 main()함수는 제거해주도록 하자.

int encryptSeedCBC( IN BYTE *pbszUserKey, IN BYTE *pbszIV, IN BYTE *pbszPlainText, OUT BYTE *pbszCipherText )
{
    printf("\n---------------------------------");
    printf("\nplainText : %s\n", (char *)pbszPlainText);
    
    int nPlainTextLen = (int)strlen((char *)pbszPlainText);// 평문의 Byte길이
    printf ("\n---------------------------------");
    printf ("\nSEED CBC Encryption....\n");
    // 암호문의 Byte길이 - 패딩 로직때문에 16바이트 블럭으로 처리함으로 pbszCipherText는 평문보다 16바이트 커야 한다.
    int nCipherTextLen = SEED_CBC_Encrypt( pbszUserKey, pbszIV, pbszPlainText, nPlainTextLen, pbszCipherText );
    return nCipherTextLen;
}

int decryptSeedCBC( IN BYTE *pbszUserKey, IN BYTE *pbszIV, IN BYTE *pbszCipherText, OUT BYTE *pbszPlainText )
{
    int nCipherTextLen = (int)strlen((char *)pbszCipherText);// 암호문의 Byte길이
    printf ("\n---------------------------------");
    printf ("\nSEED CBC Decryption....\n");
    // 평문의 Byte길이
    int nPlainTextLen = SEED_CBC_Decrypt( pbszUserKey, pbszIV, pbszCipherText, nCipherTextLen, pbszPlainText );
    return nPlainTextLen;
}

 

CryptoUtil  유틸 클래스 생성

//
//  CryptoUtil.h
//  
//
//  Created by netcanis on 2020/07/09.
//  Copyright © 2020 netcanis. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface CryptoUtil : NSObject

+(NSString *)encrypt:(NSString *)masterKey msg:(NSString *)msg;
+(NSString *)encrypt:(Byte *)key iv:(Byte *)iv msg:(NSString *)msg;

+(NSString *)decrypt:(NSString *)masterKey msg:(NSString *)base64Str;
+(NSString *)decrypt:(Byte *)key iv:(Byte *)iv msg:(NSString *)base64Str;

+(NSData *)getSHA256:(NSString *)msg;
+(NSString *)hash:(NSString *)secret payload:(NSString *)payload;

@end

NS_ASSUME_NONNULL_END

 

//
//  CryptoUtil.m
//  
//
//  Created by netcanis on 2020/07/09.
//  Copyright © 2020 netcanis. All rights reserved.
//

#import "CryptoUtil.h"
#import "CocoaSecurity.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "KISA_SEED_CBC.h"


@implementation CryptoUtil



+(NSString *)encrypt:(NSString *)masterKey msg:(NSString *)msg {
    NSData *sha256 = [self getSHA256:masterKey];
    NSData *key = [sha256 subdataWithRange:NSMakeRange(0, 16)];
    NSData *iv = [sha256 subdataWithRange:NSMakeRange(16, 16)];
    
    BYTE pbszPlainText[2048] = {0,};
    memset(pbszPlainText, 0, [msg length]);
    const char *byteBuff = [msg UTF8String];
    memcpy(pbszPlainText, (BYTE *)byteBuff, strlen(byteBuff));
    
    // 암호문 출력 버퍼
    BYTE pbszCipherText[2048] = {0,};
    int nCipherTextLen = encryptSeedCBC( (BYTE *)[key bytes], (BYTE *)[iv bytes], pbszPlainText, pbszCipherText );

    // base64 encode
    NSData *data = [[NSData alloc] initWithBytes:pbszCipherText length:nCipherTextLen];
    NSString *base64String = [data base64EncodedStringWithOptions:0];

    // memory clean
    memset(pbszPlainText, 0, nCipherTextLen);
    memset((void *)[data bytes], 0, [data length]);

#ifdef DEBUG
    // log
    [CryptoUtil printHexaLog:pbszCipherText length:nCipherTextLen];
#endif//DEBUG
    
    return base64String;
}

+(NSString *)encrypt:(Byte *)key iv:(Byte *)iv msg:(NSString *)msg {
    
    BYTE pbszPlainText[2048] = {0,};
    memset(pbszPlainText, 0, [msg length]);
    const char *byteBuff = [msg UTF8String];
    memcpy(pbszPlainText, (BYTE *)byteBuff, strlen(byteBuff));
    
    // 암호문 출력 버퍼
    BYTE pbszCipherText[2048] = {0,};
    int nCipherTextLen = encryptSeedCBC( key, iv, pbszPlainText, pbszCipherText );

    // base64 encode
    NSData *data = [[NSData alloc] initWithBytes:pbszCipherText length:nCipherTextLen];
    NSString *base64String = [data base64EncodedStringWithOptions:0];

    // memory clean
    memset(pbszPlainText, 0, nCipherTextLen);
    memset((void *)[data bytes], 0, [data length]);
    
#ifdef DEBUG
    // log
    [CryptoUtil printHexaLog:pbszCipherText length:nCipherTextLen];
#endif//DEBUG
    
    return base64String;
}

+(NSString *)decrypt:(NSString *)masterKey msg:(NSString *)base64Str {
    NSData *sha256 = [self getSHA256:masterKey];
    NSData *key = [sha256 subdataWithRange:NSMakeRange(0, 16)];
    NSData *iv = [sha256 subdataWithRange:NSMakeRange(16, 16)];
    
    // base64 decode
    NSData *data = [[NSData alloc] initWithBase64EncodedString:base64Str options:0];

    BYTE pbszCipherText[2048] = {0,};
    memcpy(pbszCipherText, [data bytes], [data length]);

    // 사용자 입력 평문
    BYTE pbszPlainText[2048] = {0,};
    int nPlainTextLen = decryptSeedCBC( (BYTE *)[key bytes], (BYTE *)[iv bytes], pbszCipherText, pbszPlainText );

    NSString *plainText = [[NSString alloc] initWithBytes:pbszPlainText length:nPlainTextLen encoding:NSUTF8StringEncoding];

    // memory clean
    memset(pbszCipherText, 0, nPlainTextLen);

#ifdef DEBUG
    // log
    [CryptoUtil printHexaLog:pbszPlainText length:nPlainTextLen];
#endif//DEBUG
    
    return plainText;
}

+(NSString *)decrypt:(Byte *)key iv:(Byte *)iv msg:(NSString *)base64Str {
    
    // base64 decode
    NSData *data = [[NSData alloc] initWithBase64EncodedString:base64Str options:0];

    BYTE pbszCipherText[2048] = {0,};
    memcpy(pbszCipherText, [data bytes], [data length]);

    // 사용자 입력 평문
    BYTE pbszPlainText[2048] = {0,};
    int nPlainTextLen = decryptSeedCBC( key, iv, pbszCipherText, pbszPlainText );

    NSString *plainText = [[NSString alloc] initWithBytes:pbszPlainText length:nPlainTextLen encoding:NSUTF8StringEncoding];

    // memory clean
    memset(pbszCipherText, 0, nPlainTextLen);
    
#ifdef DEBUG
    // log
    [CryptoUtil printHexaLog:pbszPlainText length:nPlainTextLen];
#endif//DEBUG
    
    return plainText;
}

+(NSData *)getSHA256:(NSString *)msg {
    NSData *data = [CocoaSecurity sha256:msg].data;
    return data;
}

+(NSString *)hash:(NSString *)secret payload:(NSString *)payload {
    NSString *result = [CocoaSecurity hmacSha256:payload hmacKey:secret].base64;
    return result;
}


+(void)printHexaLog:(BYTE *)pbBytes length:(NSInteger)length {
    printf ("\nLength (%ld)  : ", (long)length);
    for (int i=0;i<length;i++) {
        printf("%02X ",pbBytes[i]);
    }
}

@end

 

암호화 처리를 위해 CocoaSecurity 클래스를 사용했다.

https://github.com/kelp404/CocoaSecurity/tree/master/CocoaSecurity

 

kelp404/CocoaSecurity

Encrypt/Decrypt: AES. Hash: MD5, SHA(SHA1, SHA224, SHA256, SHA384, SHA512). Encode/Decode: Base64, Hex. - kelp404/CocoaSecurity

github.com

 

해당 클래스도 프로젝트에 추가해 준다.

 

[ 사용방법 ] 

// encode
let msg = "2020070917085299920190520000001abcdefghijklmn"
let masterKey = "1234567890";
let enc = CryptoUtil.encrypt(masterKey, msg: msg)
print("\(enc)")

// output :
3JomiSXGgIuC6vbFELbIa3+5QyJlpv6cFgy6JDcPmRryk2V+y2sueCivAymkra6D


// decode
let dec = CryptoUtil.decrypt(masterKey, msg: enc)

// output :
2020070917085299920190520000001abcdefghijklmn

 

 

2020/07/11 - [분류 전체보기] - SEED 블록암호 알고리즘 CBC (Cipher Block Chaining) 예제2

2020/07/11 - [Android/Java] - Webview에서 새로운창 출력

2020/07/11 - [Android/Tips] - Could not find com.android.tools.build:aapt2:4.0.0-6051327.

2020/07/11 - [Android/Kotlin] - byte array to hex string

2020/07/11 - [Android/Tips] - Android API Level 및 명칭

2020/07/11 - [Android/Tips] - ERROR: Could not get unknown property 'com' for root project 'myApp' of type org.gradle.api.Project

2020/07/11 - [Android/Tips] - error: cannot find symbol this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

2020/07/11 - [Android/Rooting] - LG 펌웨어 추출 및 OS 다운그레이드 (kdz file)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (4/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (3/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (2/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (1/4)

2020/06/16 - [OS/Mac OS X] - duplicate symbol 에러 해결

2020/06/12 - [iOS/Jailbreak] - Fridump 사용법 (4/4) - 결과물 바이너리 검색

2020/06/03 - [iOS/Objective-C] - NSString <-> CBUUID

반응형

'개발 > iOS' 카테고리의 다른 글

Dictionary sort  (0) 2020.07.11
UTC시간, Locale시간 변경  (0) 2020.07.11
Fridump 사용법 (4/4) - 결과물 바이너리 검색  (0) 2020.06.12
NSString <-> CBUUID  (0) 2020.06.03
위치서비스(location service) 활성화 여부 체크  (0) 2020.06.03
블로그 이미지

SKY STORY

,
반응형

android webview로 작업된 프로젝트에서 간혹 ipin 인증이나 결제 모듈 팝업, sms 인증 팝업을 띄워야 할 때가 있다.

이 경우 webChromeClient의 onCreateWindow를  Override하여야 하며 webview setting을 다음과 같이 변경해야 한다.

 

1. Webview Setting 변경

WebSettings settings = webView.getSettings();

 

settings.setJavaScriptEnabled(true);

settings.setJavaScriptCanOpenWindowsAutomatically(true);

settings.setSupportMultipleWindows(true);

 

2. WebChromeClient에 onCreateWindow Override

@Override

public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {

    WebView newWebView = new WebView(MainActivity.this);

    WebSettings webSettings = newWebView.getSettings();

    webSettings.setJavaScriptEnabled(true);



    final Dialog dialog = new Dialog(MainActivity.this);

    dialog.setContentView(newWebView);

    dialog.show();



    newWebView.setWebChromeClient(new WebChromeClient() {

        @Override

        public void onCloseWindow(WebView window) {

            dialog.dismiss();

        }

    });



    ((WebView.WebViewTransport)resultMsg.obj).setWebView(newWebView);

    resultMsg.sendToTarget();

    return true;

}

 

2020/07/11 - [Android/Tips] - Could not find com.android.tools.build:aapt2:4.0.0-6051327.

2020/07/11 - [Android/Kotlin] - byte array to hex string

2020/07/11 - [Android/Tips] - Android API Level 및 명칭

2020/07/11 - [Android/Tips] - ERROR: Could not get unknown property 'com' for root project 'myApp' of type org.gradle.api.Project

2020/07/11 - [Android/Tips] - error: cannot find symbol this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);

2020/07/11 - [Android/Rooting] - LG 펌웨어 추출 및 OS 다운그레이드 (kdz file)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (4/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (3/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (2/4)

2020/07/11 - [Android/Rooting] - 안드로이드 Fridump 환경설정 (1/4)

반응형
블로그 이미지

SKY STORY

,
반응형
반응형
블로그 이미지

SKY STORY

,
반응형
private val hexArray = "0123456789ABCDEF".toCharArray()

fun bytesToHex(bytes: ByteArray): String {
    val hexChars = CharArray(bytes.size * 2)
    for (j in bytes.indices) {
        val v = (bytes[j] and 0xFF.toByte()).toInt()

        hexChars[j * 2] = hexArray[v ushr 4]
        hexChars[j * 2 + 1] = hexArray[v and 0x0F]
    }
    return String(hexChars)
}

fun main(args: Array<String>) {

    val bytes = byteArrayOf(10, 2, 15, 11)

    val s = bytesToHex(bytes)
    println(s)
}
반응형
블로그 이미지

SKY STORY

,