일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- RSA
- Tween
- C#
- 가이드
- jumping ball
- 단말기 해상도
- base64
- ui
- Unity Editor
- 최적화
- sha
- DotsTween
- 2D Camera
- Job 시스템
- 텍스트 메시 프로
- Dynamic Font
- adfit
- AES
- 암호화
- Dots
- Framework
- Custom Package
- 이미지 폰트
- 다이나믹 폰트
- TextMeshPro
- 커스텀 패키지
- 샘플
- unity
- 프레임워크
- job
Archives
- Today
- Total
EveryDay.DevUp
[Unity] 프레임워크 개발 - 5. 암호화 ( 비대칭형 암호화 RSA ) 본문
게임에서 사용하는 암호화를 실제 코드로 구현하여 프레임워크에 추가
자세한 이론은 하단의 링크를 참고
https://everyday-devup.tistory.com/24
Crypto Class를 생성 Static 으로 암복호화 함수 추가
▶ 양방향 암호화 중 비대칭형 암호화는 RSA 를 사용
: RSA의 공개 키와 비밀 키를 파일로 저장해서 관리하기 위해 폴더 경로와 파일 이름을 추가
: 공개 키, 비밀 키 정보를 가질 수 있도록 변수 추가
public class CryptoComponent : MonoBehaviour
{
[HideInInspector]
public string folderPath = string.Empty;
[HideInInspector]
public string fileName = string.Empty;
[HideInInspector]
public string rsaBase64PublicKey = string.Empty;
[HideInInspector]
public string rsaBase64PrivateKey = string.Empty;
}
: 공개 키, 비밀 키 암복호화 코드
public class Crypto
{
static Dictionary<string, CryptoRSA> _rsaManages = new Dictionary<string, CryptoRSA>();
static void CreateRSAManage(string base64PublicKey, string base64PrivateKey)
{
CryptoRSA rsaManage = new CryptoRSA();
rsaManage.Create( base64PublicKey, base64PrivateKey );
_rsaManages.Add( base64PublicKey, rsaManage );
}
public static string EncryptRSAbyBase64PublicKey(string plainText, string base64PublicKey, string base64PrivateKey )
{
if( _rsaManages.ContainsKey( base64PublicKey ) == false )
{
CreateRSAManage( base64PublicKey, base64PrivateKey );
}
return _rsaManages[base64PublicKey].Encrypt( plainText );
}
public static string DecryptRSAByBase64Key(string encryptData, string base64PublicKey, string base64PrivateKey)
{
if( _rsaManages.ContainsKey( base64PublicKey ) == false )
{
CreateRSAManage( base64PublicKey, base64PrivateKey );
}
return _rsaManages[base64PublicKey].Decrypt( encryptData );
}
}
: RSA 키 생성 및 저장/로드 기능 추가
using System.Security.Cryptography;
using System.Text;
using UnityEditor;
using UnityEngine;
[CustomEditor( typeof( CryptoComponent ) )]
public class CryptoEditor : Editor
{
CryptoComponent _cryptoComponent;
private void OnEnable()
{
_cryptoComponent = (CryptoComponent)target;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
OnRsaUI();
}
void OnRsaUI()
{
EditorGUILayout.TextField( "RSA Base64 Public Key", _cryptoComponent.rsaBase64PublicKey );
EditorGUILayout.TextField( "RSA Base64 Private Key", _cryptoComponent.rsaBase64PrivateKey );
if( GUILayout.Button( "Create" ) )
{
RSACryptoServiceProvider rsaCryptoServiceProvider = new RSACryptoServiceProvider();
RSAParameters privateKeyParam = RSA.Create().ExportParameters( true );
rsaCryptoServiceProvider.ImportParameters( privateKeyParam );
string privateKey = rsaCryptoServiceProvider.ToXmlString( true );
_cryptoComponent.rsaBase64PrivateKey = Crypto.EncodingBase64( privateKey );
RSAParameters publicKeyParam = new RSAParameters();
publicKeyParam.Modulus = privateKeyParam.Modulus;
publicKeyParam.Exponent = privateKeyParam.Exponent;
rsaCryptoServiceProvider.ImportParameters( publicKeyParam );
string publicKey = rsaCryptoServiceProvider.ToXmlString( false );
_cryptoComponent.rsaBase64PublicKey = Crypto.EncodingBase64( publicKey );
EditorUtility.SetDirty( _cryptoComponent );
}
EditorGUILayout.BeginHorizontal();
EditorGUILayout.TextField( "RSA Save/Load Path", _cryptoComponent.folderPath );
if( GUILayout.Button( "Select" ) )
{
_cryptoComponent.folderPath = EditorUtility.OpenFolderPanel( "Select Folder", _cryptoComponent.folderPath, "" );
}
EditorGUILayout.EndHorizontal();
_cryptoComponent.fileName = EditorGUILayout.TextField( "RSA FileName", _cryptoComponent.fileName );
if( GUILayout.Button( "Save" ) )
{
string data = _cryptoComponent.rsaBase64PublicKey + "\n" + _cryptoComponent.rsaBase64PrivateKey;
FileUtil.WriteFile( _cryptoComponent.folderPath, _cryptoComponent.fileName, ".txt", data, _cryptoComponent.aesBase64Key, _cryptoComponent.aesBase64IV );
}
if( GUILayout.Button( "Load" ) )
{
string data = FileUtil.ReadFile( _cryptoComponent.folderPath, _cryptoComponent.fileName, ".txt", _cryptoComponent.aesBase64Key, _cryptoComponent.aesBase64IV );
string[] splitData = data.Split( '\n' );
_cryptoComponent.rsaBase64PublicKey = splitData[0];
_cryptoComponent.rsaBase64PrivateKey = splitData[1];
}
}
}
'FrameWork' 카테고리의 다른 글
[Unity] 프레임워크 개발 - 7. 암호화 변수 (0) | 2020.05.05 |
---|---|
[Unity] 프레임워크 개발 - 6. 데이터(파일) 쓰기/읽기 (0) | 2020.05.05 |
[Unity] 프레임워크 개발 - 5. 암호화 ( 단방향 암호화 SHA256 ) (0) | 2020.05.04 |
[Unity] 프레임워크 개발 - 5. 암호화 ( 대칭형 암호화 AES ) (0) | 2020.05.04 |
[Unity] 프레임워크 개발 - 5. 암호화 ( Base64 ) (0) | 2020.05.02 |