암호화 테스트 한 솔루션입니다.
AES256 tripleDes 검증했습니다.
잘작동하는데 왜 작동하는지 궁금해서 질문 드립니다.
여기에 소스 코드 올려놨습니다.
https://github.com/jys923/CryptSample.git
TripleDESSample/MyDES.cs의 CreateWeakEncryptor 질문 입니다.
.net tripleDes가 약한 키는 못쓰게 막혀있습니다.
약한키도 사용가능하게 CreateWeakEncryptor 로 키 체크 부분을 우회한 코드입니다.
데충 리플렉션으로 약한 키 생성 부분을 우회 한건 알것 같습니다.
Q. 그런데 MyDES 가 스태틱인 이유?
Q. 스태틱인데 MyDES.CreateWeakEncryptor 가 아니고
Q. new TripleDESCryptoServiceProvider().CreateWeakEncryptor 이렇게 사용 가능한 이유
Q. using에 참조도 없는데 CreateWeakEncryptor 사용 가능한 이유
Q. public static ICryptoTransform CreateWeakEncryptor(this TripleDESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv)
this 왜 있는건지?
Q. 해당 코드를 아예 다른 파일로 만들어서 클래스로 분리 해야 작동하는 이유
#region TripleDESCryptoExtensions
public static ICryptoTransform CreateWeakEncryptor(this TripleDESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv)
{
// reflective way of doing what CreateEncryptor() does, bypassing the check for weak keys
MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
object[] Par = { key, cryptoProvider.Mode, iv, cryptoProvider.FeedbackSize, 0 };
ICryptoTransform trans = mi.Invoke(cryptoProvider, Par) as ICryptoTransform;
return trans;
}
public static ICryptoTransform CreateWeakEncryptor(this TripleDESCryptoServiceProvider cryptoProvider)
{
return CreateWeakEncryptor(cryptoProvider, cryptoProvider.Key, cryptoProvider.IV);
}
public static ICryptoTransform CreateWeakDecryptor(this TripleDESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv)
{
// reflective way of doing what CreateDecryptor() does, bypassing the check for weak keys
MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
object[] Par = { key, cryptoProvider.Mode, iv, cryptoProvider.FeedbackSize, 1 };
ICryptoTransform trans = mi.Invoke(cryptoProvider, Par) as ICryptoTransform;
return trans;
}
public static ICryptoTransform CreateWeakDecryptor(this TripleDESCryptoServiceProvider cryptoProvider)
{
return CreateWeakDecryptor(cryptoProvider, cryptoProvider.Key, cryptoProvider.IV);
}
#endregion
전부 static에 연관되는 이야기 같은데 잘모르겠네요.
static은 정적 처음 실행 할때 생성, new 말고 클래스 명으로 사용 가능 이런 것 뿐이 모르네요.
긴 질문 읽어주셔서 감사합니다.
[최초 등록일: ]
[최종 수정일: 10/27/2022]